Hallo,
gegeben sei folgende Klassen-Hierarchie:
---- .h-Datei ----
//CBase
class CBase {
protected:
LPCWSTR name = nullptr;
virtual LPCWSTR getName();
public:
CBase();
}
//CDerived
class CDerived : public CBase {
protected:
LPCWSTR getName() override;
public:
CDerived();
}
---- .cpp-Datei ----
//CBase
CBase::CBase() {
name = getName();
}
LPCWSTR CBase::getName() {
return L"Basisklasse";
}
//CDerived
CDerived::CDerived() : CBase() {}
LPCWSTR CDerived::getName() {
return L"Abgeleitete Klasse";
}
-----------------------------
Wie man sieht, ruft der Konstruktor der abgeleiteten Klasse den Konstruktor
der Basisklasse auf. Dort wird die virtuelle Methode getName() aufgerufen und
deren Rückgabewert dem Member "name" zugewiesen.
Von anderen Programmiersprachen wie z. B. Delphi kenne ich es nun so, dass
auch der Konstruktor der Basisklasse *nicht* die Methode der Basisklasse
aufruft, sondern die Methode der Klasse, von der aus der Konstruktor der
Basisklasse aufgerufen wurde. D. h. wenn ich in Delphi folgendes mache:
//CBase -------------------
class CBase {
protected
name : LPCWSTR;
function getName : LPCWSTR; virtual;
public
constructor Create; virtual;
}
constructor CBase.Create;
begin
name := getName;
//ruft CDerived.getName() auf, wenn CBase.Create() von einem Objekt der
//Klasse CDerived aufgerufen wurde!
end;
function CBase.getName : LPCWSTR;
begin
Result := "Basisklasse";
end;
//CDerived ----------------
class CDerived = class(CBase) {
protected
function getName; override;
public
constructor Create; override;
}
constructor CDerived.Create;
begin
inherited Create;
end;
function CDerived.getName;
begin
Result := "Abgeleitete Klasse";
end;
und anschließend
type
derived : CDerived;
derived := CDerived.Create;
würde
derived.name nach Abarbeiten des Konstruktors auf "Abgeleitete Klasse"
zeigen, und das obwohl der Member "name" im Konstruktor der Basisklasse
gesetzt wurde.
Nicht so in C++: macht man da das entsprechende
CDerived* derived = new CDerived();
zeigt derived->name auf "Basisklasse", auch wenn der Konstruktor (und damit
getName()) vom Konstruktor einer abgeleiteten Klasse aufgerufen wurde. Dieses
Verhalten irritiert mich. Wie kann ich es erreichen, dass beim Aufruf des
Konstruktors von CBase über den Konstruktor eines Objekts der Klasse CDerived
*nicht* CBase::getName(), sondern CDerived::getName() aufgerufen wird?
Gruß
Michael