2016-06-24 17 views
3

Nach ca. 6 o 7 Jahren Programmierung fast ausschließlich auf C++, habe ich entdeckt, dass:C++ static_cast über einen Zeiger auf virtuelle Basisklasse

struct A 
{ 
    virtual ~A() = 0; // Abstract class 
}; 

A::~A() {} 

struct B : virtual A 
{}; 

int main() 
{ 
    A* a = new B; 
    (void)static_cast<B*>(a); 

    return 0; 
} 

einen Compiler-Fehler führt, weil der Standard darf nicht zu Führen Sie eine statische Umwandlung von einem Zeiger zu einer virtuellen Basisklasse durch. Ich gehe davon aus, dass das mit dem Speicherlayout einer virtuellen Basisklasse zusammenhängt, aber ich würde gerne die Details kennen.

+0

Ihr Code kompiliert; meinst du nicht "struct B: public virtual A"? – lorro

+1

Danke für die Warnung. Gelöst (ja, das meinte ich) –

Antwort

0

Der Grund ist, dass das Speicherabbild von virtual A in B und das von A abweichen könnte. Ohne es zu unterscheiden, konnte der bekannte "gewagte Diamant" nicht gelöst werden (naja, zumindest nicht leicht, da wir A nicht anfordern können, dies zu beachten und eine ABI einzurichten, die uns vorzuziehen ist). Denken Sie an virtual A mit einer virtuellen Funktion für jede Funktion und Mitglied Zugriff von A in B. Es ist nicht unbedingt so implementiert, aber Sie könnten es so modellieren.