2016-05-12 6 views
5

Следующий код - метод привязки последнего связывания(), но не должен ли он связываться раньше? потому что метод испытания() не является виртуальным в классе В (но в классе А), и мы используем указатель класса B.виртуальная функция в родительском классе родительского класса

class A{ 
    public: 
     virtual void test(){ 
      cout<<"test a"; 
     } 
}; 
class B : public A{ 
    public: 
     void test(){ 
      cout<<"Test b"; 
     } 
}; 
class C: public B{ 
    public: 
     void test(){ 
      cout<<"test c"; 
     } 
}; 
int main(){ 
    B *bp; 
    C objc; 
    bp = &objc; 
    bp->test(); // test c 
} 
+5

'test' является виртуальным во всех классах здесь; ключевое слово 'virtual' не нужно повторять. – MicroVirus

ответ

5

После того, как функция была объявлена ​​в классе virtual, это всегда виртуальные в классы, которые наследуют от этого класса, , используете ли вы ключевое слово virtual или нет.

Так что в вашем классе C функция test() фактически перекрывая B и собственные функции test()A «s.

4

N4296, 10.3§2 (draft version):

Если виртуальная функция-член объявляется VF в классе Base и в класса Derived, полученные непосредственно или косвенно из базы, член функции ФЖ с таким же именем объявляется список параметров-типа (8.3.5), cv-qualification и ref-qualifier (или его отсутствие) как Base :: vf , тогда Derived :: vf также является виртуальным (независимо от того, действительно ли это ) и он отменяет Base :: vf.

Акцент на меня.

Виртуальная функция остается виртуальной во всех производных классах, независимо от того, объявлен ли она как virtual в производных классах.

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