Heim  >  Artikel  >  Backend-Entwicklung  >  Der Konstruktor kann keine virtuelle Funktion sein

Der Konstruktor kann keine virtuelle Funktion sein

巴扎黑
巴扎黑Original
2016-12-20 16:48:592326Durchsuche

Die Gründe, warum Konstruktoren nicht als virtuelle Funktionen deklariert werden können:

1. Die sogenannte virtuelle Funktion bedeutet, dass in polymorphen Situationen nur eine ausgeführt wird. Aus dem Konzept der Vererbung ist immer das übergeordnete Klassenobjekt Um ein Unterklassenobjekt zu erstellen, müssen Sie beim Erstellen des Konstruktors der übergeordneten Klasse den Konstruktor explizit aufrufen befinden sich in der Unterklasse Wenn Zhongyi versehentlich eine Funktion neu schreibt, die mit dem Konstruktor der übergeordneten Klasse übereinstimmt, wird Ihr übergeordneter Klassenkonstruktor überschrieben, dh die Konstruktion der übergeordneten Klasse kann nicht abgeschlossen werden und es tritt ein Fehler auf.

Klasse A
{
öffentlich :
virtuell A()
{
cout<<"A"< }
                                                                              >
};

Am Kompilierungspunkt wurde angezeigt, dass es nicht übergeben werden kann. Remove virtual

2. Die Hauptbedeutung virtueller Funktionen liegt in der abgeleiteten Klasse. Wenn der Konstruktor der abgeleiteten Klasse Parameter verwendet, fügt der Compiler den Code hinzu muss Parameter für die Basisklasse in ihrem Konstruktor bereitstellen, d Natürlich gibt es auch andere Erklärungen: 1. Aus Sicht des Speicherplatzes entspricht die virtuelle Funktion einer vtable, aber diese vtable wird tatsächlich im Speicherplatz des Objekts gespeichert. Wenn der Konstruktor virtuell ist, muss er über die vtable aufgerufen werden, das Objekt wurde jedoch nicht instanziiert, das heißt, es ist kein Speicherplatz vorhanden und die vtable kann nicht gefunden werden, sodass der Konstruktor kein virtueller Konstruktor sein kann Funktion.

2. Aus Sicht der Nutzung werden virtuelle Funktionen hauptsächlich verwendet, um den Aufruf überlasteter Funktionen bei unvollständigen Informationen zu ermöglichen. Der Konstruktor selbst dient dazu, die Instanz zu initialisieren. Die Verwendung virtueller Funktionen hat also keine Instanzbedeutung. Die erste Instanz wird nicht initialisiert. Wie kann sie also polymorph sein? Die Funktion einer virtuellen Funktion besteht darin, dass sie, wenn sie über einen Zeiger oder eine Referenz der übergeordneten Klasse aufgerufen wird, zur Mitgliedsfunktion werden kann, die die Unterklasse aufruft. Der Konstruktor wird automatisch aufgerufen, wenn ein Objekt erstellt wird, und kann nicht über einen Zeiger oder eine Referenz von der übergeordneten Klasse aufgerufen werden. Daher ist festgelegt, dass der Konstruktor keine virtuelle Funktion sein darf.

3. Aus Sicht der Implementierung wird die vtable nach dem Aufruf des Konstruktors erstellt, sodass der Konstruktor keine virtuelle Funktion sein kann. Aus praktischer Sicht kann der tatsächliche Typ des Objekts nicht bestimmt werden Wenn der Konstruktor aufgerufen wird ( Die Unterklasse muss den Konstruktor der übergeordneten Klasse aufrufen) und der Konstruktor die Initialisierung bereitstellt. Es handelt sich nicht um ein dynamisches Verhalten des Objekts, und dies ist auch nicht erforderlich zu einer virtuellen Funktion werden.


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn