2016-05-12 30 views
5

Der folgende Code ist späte Bindung test() -Methode, aber sollte es nicht früh binden? weil Test() -Methode in der Klasse B (aber in der Klasse A) nicht virtuell ist, und wir sind mit Zeigern der Klasse B.virtuelle Funktion in Eltern der Elternklasse

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' ist virtuell in allen Klassen hier; Das Schlüsselwort 'virtual' muss nicht wiederholt werden. – MicroVirus

Antwort

5

Sobald eine Funktion virtual in einer Klasse deklariert wurde, dann ist es immer virtuell in dem Klassen, die von dieser Klasse erben, , ob Sie das Schlüsselwort virtual verwenden oder nicht.

So in Ihrer Klasse C, die test() Funktion B und A der eigenen test() Funktionen überschreibt tatsächlich.

4

N4296, 10.3§2 (draft version):

Wenn eine virtuelle Mitgliedsfunktion vf wird in einer Klasse Base und in einer Klasse abgeleitet, die direkt oder indirekt von der Basis, eine Mitgliedsfunktion vf erklärt mit dem gleichen Namen, Parameter-Typ-Liste (8.3.5), cv-Qualifikation, und Ref-Qualifikationsmerkmal (oder Abwesenheit derselben) wie Base :: vf deklariert ist, dann abgeleitet wird :: vf ist auch virtuell (ob es so ist deklariert) und es überschreibt Base :: vf.

Hervorhebung von mir.

Eine virtuelle Funktion bleibt in allen abgeleiteten Klassen virtuell, unabhängig davon, ob sie in den abgeleiteten Klassen als virtual deklariert ist.