Virtuelle Methoden für eine virtuelle Basisklasse

8

Etwas, das mich bezüglich der Vererbung virtueller Basisklassen verwirrt hat ... Gegeben die folgenden Klassen:

%Vor%

Wird das kompiliert? Wenn ja, was wäre das Ergebnis des folgenden Codes:

%Vor%     
sooniln 07.07.2011, 18:12
quelle

4 Antworten

7

Es sollte nicht kompiliert werden, die Funktion foo wird mehrdeutig sein. Da A :: foo () reine virtuelle Funktion ist, muss die Mehrdeutigkeit aufgelöst werden.

    
Sharath 07.07.2011, 18:22
quelle
4

Es wird nicht kompiliert. GCC:

%Vor%

Das hättest du ziemlich schnell herausgefunden.

Gleiches gilt für icc:

%Vor%     
Mat 07.07.2011 18:19
quelle
4

Es wird aus drei Gründen nicht kompiliert, von denen nichts mit virtueller Vererbung zu tun hat (naja, vielleicht die letzte).

  1. Sie haben die Semikolons nach den Klassendefinitionen vergessen

  2. Ihre Erbschaft ist privat

  3. D::foo() ist mehrdeutig, wenn nicht explizit überschrieben

Übrigens, die Definition von D selbst ist schlecht formuliert, nicht nur die Tatsache, dass Sie versuchen, es zu benutzen. Ich meine, wenn Ihre main() -Funktion leer wäre, würde es immer noch nicht kompilieren.

Und "Wird das kompilieren?" hat die offensichtliche Antwort "Warum versuchst du es nicht?"

Zitat aus dem Standard: 10.3.10

  

Das folgende Beispiel zeigt eine Funktion, die nicht eindeutig ist   endgültiger Overrider:

%Vor%     
Armen Tsirunyan 07.07.2011 18:14
quelle
3

Nein, es wird nicht:

%Vor%

Dies wird das Diamond-Problem genannt, siehe Ссылка

    
phlogratos 07.07.2011 18:22
quelle