Call derived class method from base class reference

前端 未结 2 1801
南旧
南旧 2020-12-31 12:10
class Material
{
public:
 void foo()
 {
  cout << \"Class Material\";
 }
};

class Unusual_Material : public Material
{
public:
 void foo()
 {
  cout <<          


        
2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-31 12:59

    What you want is polymorphism, and to enable it for a function you need to make it virtual:

    class Material 
    { 
    public: 
        virtual void foo() // Note virtual keyword!
        { 
            cout << "Class Material"; 
        } 
    }; 
    
    class Unusual_Material : public Material 
    { 
    public: 
        void foo() // Will override foo() in the base class
        { 
            cout << "Class Unusual_Material"; 
        } 
    }; 
    

    Also, polymorphism only works for references and pointers:

    int main()  
    {  
        Unusual_Material unusualMaterial;
        Material& strange = unusualMaterial;
        strange.foo();  
        return 0; 
    }
    
    /* OR */
    
    int main()  
    {  
        Unusual_Material unusualMaterial;
        Material* strange = &unusualMaterial;
        strange->foo();  
        return 0; 
    }
    

    What you have in your code snippet will slice the Unusual_Material object:

    int main() 
    { 
        // Unusual_Material object will be sliced!
        Material strange = Unusual_Material(); 
        strange.foo(); 
        return 0; 
    } 
    

提交回复
热议问题