2013-02-12 2 views
0
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; 

тогда:Действительно ли член базового класса C++ должен быть виртуальным, чтобы быть переопределенным производным классом?

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**; 

Почему это вернуть "" здесь? Это имеет для меня смысл, потому что я предполагаю, что (вид перегруженных) членов производного класса (B) на первом месте! Что здесь происходит?

+2

'B-> test()' не компилируется. Что заставляет вас думать, что второй пример приводит к нулю? – aschepler

+2

Да, ваши концепции неверны. Даже если вы измените B на b, чтобы скомпилировать его, оно вернется. 10. –

+0

Вы пробовали? Я действительно не думаю, что он вернется 0 –

ответ

4

Помимо неправильного синтаксиса (B->test();, где он должен быть b->test();), второй также будет возвращать 10.

Если вместо этого вы бы написали:

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

Он вернулся бы 0 или 10 в зависимости от того, является ли A :: test виртуальным.

+0

Перейдите по ссылке: http://www.cplusplus.com/doc/tutorial/polymorphism/ и Ctrl + F «varify» и посмотрите пример выше. Теперь, если я делаю базовое виртуальное funtion не виртуальным и выделяю «ppoly1» не как многоугольник, а как CRectangle, он вернет 0! – user1511417

+0

@ user1511417: Потратьте время, чтобы перечитать код на связанной странице. Вы получите только реализацию базы, если статический тип указателя/ссылки * base * –

Смежные вопросы