Ich habe einen seltsamen Fall von Objekt Slicing. Ich arbeite an Projekt, wo ich Singleton-Klassen brauche, so dass meine Basis und abgeleitete Klasse beide Singleton sind. Der folgende Beispielfall beschreibt meine Situation.Kurioser Fall von C++ - Objekt-Slicing-Verhalten auf statische Datenbasiselement der Basisklasse
Dies ist meine Basisklasse
// Base.h
class Base
{
public:
static Base& base;
virtual void doSomething(){ cout<<"Base Do Something"<<endl; }
protected:
Base();
virtual ~Base();
static Base& getBaseInstance();
private:
};
//Base.cpp
Base::Base()
{
//ctor
}
Base::~Base()
{
//dtor
}
Base& Base::getBaseInstance()
{
static Base object;
return object;
}
Base& Base::base=Base::getBaseInstance();
Das ist meine Abgeleitete Klasse
class Derived: public Base
{
public:
static Derived& derived;
virtual void doSomething(){ cout<<"Derive Do Something"<<endl; }
static Derived& getDerivedInstance();
protected:
Derived();
virtual ~Derived();
private:
};
Derived::Derived()
{
//ctor
}
Derived::~Derived()
{
//dtor
}
Derived& Derived::derived=Derived::getDerivedInstance();
Derived& Derived::getDerivedInstance()
{
static Derived object;
return object;
}
Und schließlich das ist meine Hauptfunktion
int main()
{
cout << "Hello world!" << endl;
Base::base.doSomething();
Derived::derived.doSomething();
Base::base=Derived::derived;
Base::base.doSomething();
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
Base& r = Derived::derived;
r.doSomething();
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
return 0;
}
Und ich bin immer dafür folgende Ausgabe
Also meine Frage ist, da Objekt Slicing nicht auf Referenzen funktionieren sollte, warum kann ich nicht Base::base
Referenz überschrieben werden, die ich als statisches Datenelement der Basisklasse mit abgeleitetem Objekt erstellt habe? Das funktioniert gut auf Base& r = Derived::derived;
Ich meine, wenn ich etwas mit r.doSomething()
aufrufen, bekomme ich DoSomething der abgeleiteten Klasse. Aber das ist nicht so mit
Base::base=Derived::derived;
Base::base.doSomething();
oder
Base::base=Derived::getDerivedInstance();
Base::base.doSomething();
werden Jede Art von Klärung geschätzt. Danke.
Sie können Referenzen nicht zurücknehmen. Wenn es so aussieht, als ob Sie dann sind, was passiert ist Schneiden. –
Danke Kumpel. Ich habe so einen dummen Fehler gemacht (Codierung seit 2 Nächten gerade, ich schätze ich sollte einfach schlafen) Danke nochmal. –