2010-12-18 12 views
1

diesen Code Gegeben:Warum ist Base * pd = neu abgeleitet; einen Fehler erzeugen?

class Base{ 
public: 
    Base(); 
    virtual ~Base(); 
}; 

class Derived: protected Base{ 
public: 
    virtual ~Derived(); 
}; 

In Haupt Ich versuche, auf diese Weise Basis zuzuordnen abgeleitet:

Base *pd = new Derived; 

Warum diese Anweisung einen Fehler zu generieren?

Hier wird new einen Zeiger des Objekttyps zurückgeben, und wir können immer einen abgeleiteten Zeiger einer Basis zuordnen. Korrigiere mich, wenn ich falsch liege.

+2

Kein Code ?! Es kann eine beliebige Anzahl von Fehlern geben ... –

+1

Wahrscheinlich, weil Sie nicht erklärten 'Abgeleitet: Base' – BoltClock

+1

Dies sollte funktionieren, ja. Die offensichtlichste Lösung ist die von @BoltClock. Abgeleitet muss Base an erster Stelle erben. Wenn dies nicht der Fall ist, bieten Sie bitte einen Code an, der es jemandem ermöglicht, das Problem zu diagnostizieren. Auch, was ist die Fehlermeldung? – mingos

Antwort

9

Um einen Zeiger auf eine Klasse in einen Zeiger auf einen anderen Klassentyp zu konvertieren, muss die Konvertierung an dem Punkt verfügbar sein, an dem sie aufgerufen wird.

Als Base eine geschützte Basis von Derived man kann nicht eine Variable vom Typ Base * aus dem Ausdruck new Derived (die Derived * hat Typen) initialisieren außerhalb einer Elementfunktion von Derived, eine Klasse davon abgeleitet oder ein friend von Derived .

+0

aber selbst, indem ich es zu einer öffentlichen Vererbung mache, bekomme ich einen Link error..saying referenzierten Aufruf für cont und Destruktor in abgeleiteten Klasse ... LNK2019 – sriks

+1

Klasse Base { public: Base(); virtuell ~ Base(); }; Klasse abgeleitet: geschützte Basis { public: virtual ~ Derived(); }; int main() { Basis * pd = neu Abgeleitet; Rückgabe 0; } – sriks

+1

@Srikanth Reddy: Das liegt daran, dass Sie * die Konstruktoren und Destruktoren * nicht implementiert haben. – greyfade

0

Ein Linker-Fehler kann nur das Ergebnis der fehlenden Implementierungen für die Klassen sein. Es würde helfen, wenn Sie die bestimmten Fehlermeldungen posten könnten.

Verwandte Themen