problem mit statischen klassenvariablen und vererbung



  • hi leute,
    ich habe folgendes problem: ich habe die drei klassen MetaClass, Object und A. A ist von Object abgeleitet. beide haben eine statische klassenvariable MetaClass * meta_class, die beim programmstart mit einer neuen MetaClass initialisiert wird.
    Object hat außerdem die methode "get_class_name()" welche eine methode von MetaClass aufruft.

    A erbt "get_class_name()" natürlich von Object. rufe ich in einem objekt von A aber get_class_name() auf, dann wird der klassenname von Object und nicht von A zurückgegeben.

    hier der code:

    class Object {
    public:
    	virtual char const * get_class_name () const;
    	Object ();
    	virtual ~Object ();
    
    	static MetaClass * meta_class;
    };
    MetaClass * Object::meta_class = new MetaClass("Object);
    
    class A : public Object {
    public:
    	A () {}
    	~A () {}
    
    	static MetaClass * meta_class;
    };
    MetaClass * A::meta_class = new MetaClass("A");
    
    char const * Object::get_class_name () const {
    	return meta_class->get_client_class_name();
    }
    
    class MetaClass {
    	const char * client_class_name;
    public: 
    	char const * get_client_class_name () const; 
    	MetaClass (const char * client_class_name);
    	~MetaClass (); 
    };
    
    char const * MetaClass::get_client_class_name () const {
    	return client_class_name;
    }
    
    MetaClass::MetaClass(char const * client_name) : client_class_name(client_name) { }
    
    int main() {
    	Object o;
    	std::cout << o.get_class_name() << std::endl;
    	A a;
    	std::cout << a.get_class_name() << std::endl;
    	return 0;
    }
    

    beides gibt "Object" aus, obwohl der zweite aufruf "A" ausgeben müsste 😞

    irgendwie liegt es daran, dass "meta_class" von Object genommen wird, und nicht von A.

    hier ein screenshot vom debugger:
    http://pictureposter.allbrand.nu/pictures/johnnydanger/sonstiges/staticmetaclass.JPG

    in grün seht ihr die meta_class die eigentlich genommen werden sollte und im this-zeiger ja auch drinnen steht 😞
    in rot seht ihr die meta_class die stattdessen genommen wird. wie kann ich dem programm sagen, doch bitte die meta_class von A zu nehmen (weil ja auch die methode von einem objekt der klasse A aufgerufen wird) und nicht die meta_class von Object?

    vielen dank!
    lg johnny



  • steininger schrieb:

    wie kann ich dem programm sagen, doch bitte die meta_class von A zu nehmen (weil ja auch die methode von einem objekt der klasse A aufgerufen wird) und nicht die meta_class von Object?

    Das Problem liegt in der Funktion Object::get_class_name. Dies ist eine Funktion der Basisklasse, also wird auch meta_class der Basisklasse verwendet. Du müsstest A ebenfalls eine solche Funktion spendieren. Und damit das korrekt über die Vererbungshierarchie hinweg funktioniert, müsste die Funktion dann virtuell sein.



  • ...wenn meine klasse mehrere solche methoden hat, dann muss ich ja immer extra alle methoden überschreiben?

    und das ganze immer wenn ich eine neue klasse ableite? gibts keine möglichkeit die datenkomponente "dynamisch zu binden", also die klasse dazu zu bringen, auch die eigene meta_class zu verwenden?



  • Mit einer virtuellen Methode die den Zugriff auf das Meta Daten Objekt liefert sollte es gehen. Dann müsste nur diese überschrieben werden.



  • ES GEHT! YEEEES :D:D::D:D:D::DD

    daaaaaaaaaaaaaaaaaaaaaaaaaaaaannnnnnnke!!! ein hoch auf den noblen spender 😃


Anmelden zum Antworten