2016-04-24 16 views
0

ich das grundlegende Konzept der virtuellen Funktion und VTable verstehen, aber im folgenden Beispiel, ich verstehe nicht, warum c.A(); drucktvirtueller Funktionsaufruf innerhalb einer Elementfunktion der Klasse

parent A 
child 

, aber ohne das Schlüsselwort virtual für Eltern :: func(), druckt er

parent A 
parent 

heraus Würden Sie mich im Detail kennen den Grund lassen? Es wäre großartig, mit v-Tabelle, Speicher (Heap, Stack) usw. zu erklären.

Danke.

#include <iostream> 

template <class TYPE> class Parent 
{ 
public: 
    Parent() {}; 
    ~Parent() {}; 
    virtual void func() { std::cout << "parent" << std::endl; }; 

    void A() { 
     std::cout << "parent A" << std::endl; 
     func(); 
    } 

}; 

template <class TYPE> class Child : public Parent <TYPE> 
{ 
public: 
    Child() {}; 
    ~Child() {}; 

    void func() { std::cout << "child" << std::endl; }; 
}; 

void main() 
{ 
    Child<int> c; 
    c.A(); 
} 

Antwort

2

Das virtuelle Schlüsselwort gibt an, dass die Funktion in einer abgeleiteten Klasse neu definiert werden kann, während die Berufung Eigenschaften obwohl Referenzen zu erhalten. Dies ist im Grunde der Auslöser für polymorphes Verhalten. Wenn die Funktion als virtuell deklariert wird und in einer abgeleiteten Klasse neu definiert wird, wird die vtable verwendet, um die entsprechende Version der Funktion auszuwählen, sofern kein spezifischer Namespace angegeben ist. Zum Beispiel Eltern :: func(). Trotz des gleichen Namens, ohne das Schlüsselwort virtual, sind die beiden Funktionen, die Sie func() nennen, völlig verschieden. Für die Basisklasse, die auf die abgeleitete Klassenversion der Funktion zugreifen kann, ist kein Verweis verfügbar. Es verwendet die einzige bekannte Version func(), die in der Basisklasse definiert ist.

0

@ Pemdas gab eine nette Erklärung. Hier ist mein Versuch.

c.A() sagt Compiler "Ich werde die nicht virtuelle Funktion A, die in meiner Elternklasse definiert ist, aufrufen". Dies führt zu Parent::A(&c)

A Die Methode in der Klasse Parent übersetzt „die vtable Objekt & c zu erhalten, die Funktionszeiger in erster Reihe greifen, und nennt es“. Da c die Funktion func neu implementiert, wäre der Funktionszeiger c die Implementierung der Funktion func. Das würdest du sehen.

Verwandte Themen