2016-11-27 5 views
1

I virtuelle Methode, die statische Methode der entsprechenden Klasse ruft:C++ Aufruf statische Funktion von virtueller Funktion

class A{ 
public: 
    static void bar() {std::cout<<"bar A\n";} 
    virtual void foo(){ 
     //Some A work... 
     bar(); 
    } 
}; 

class B : public A{ 
public: 
    static void bar() {std::cout<<"bar B\n";} 
    virtual void foo() override { 
     //Some B work... 
     bar(); //prints bar B, as intended. 
    } 
}; 

Aber jetzt will ich Klasse C haben, mit der Methode foo(), mit dem einzigen Unterschied C :: bar() aufgerufen werden am Ende:

class C : public A { 
public: 
    static void bar() override {std::cout<<"bar C\n";} 
    virtual void foo(){ 
     //Some **A** work... 
     bar(); //I want to print "bar C" here 
    } 
} 

Doch hier musste ich vollständige Kopie der Methode A :: foo Definition machen. Ich könnte auch eine virtuelle Dummy-Methode wie `virtual void callStaticBar() {bar();} einführen und sie in Klasse C mit demselben Text überschreiben. Gibt es einen eleganteren Weg, so etwas zu tun?

Antwort

0

Nein. Wenn C::foo() nicht definiert ist, ruft der Aufruf foo() auf einer C Instanz wirklich A::foo(); da Klasse A keine Kenntnis der Klasse C hat (mit Ausnahme der Fälle mit der vtable), gibt es keine Möglichkeit für A::foo(), C::bar() aufzurufen, ungeachtet der Tatsache, dass der ursprüngliche Aufruf von einer C Instanz kam.

Sie müssen Ihre Methode der virtuellen Dummy-Methode verwenden oder uns mehr darüber erzählen, was Sie erreichen möchten, da sie in einer bestimmten Situation eine bessere Lösung darstellen könnten.

+0

Ok, ich denke, ich sehe den Punkt. 'A :: bar()' und 'C :: bar()' sind völlig verschiedene Funktionen und sie haben denselben Namen und ändern diese Tatsache nicht. Ich konnte nicht hoffen, 'C :: other_bar()' von 'A :: foo()' zu nennen, ohne es zu überschreiben, also kann ich es auch nicht mit 'C :: bar()' tun. –

Verwandte Themen