C ++基类的成员是否真的需要虚拟才能被派生类覆盖?

时间:2013-02-12 19:22:15

标签: c++ polymorphism virtual members

class A { 
    public: 
    virtual int test()=0; 
};

class B : public A { 
   public: 
   int test(){return 10;}
};


B *b = new B();
b->test(); // would return 10;

class A { 
    public: 
    int test(){return 0;}
};

class B : public A { 
   public: 
   int test(){return 10;}
};


B *b = new B();
b->test(); // **would return 0**;

为什么在这里返回“ 0 ”?这对我来说没有任何意义,因为我认为派生类(B)的(重载的)成员是第一位的! 这里发生了什么?

1 个答案:

答案 0 :(得分:4)

除了无效的语法(B->test();,它应该是b->test();),第二个也将返回10.

如果相反,你会写:

A* a = new B();
a->test();

它将返回0或10,具体取决于A :: test是否为虚拟。