2016-11-27 143 views
1

靜態函數我有一個調用相應類的靜態方法,虛方法:C++調用從虛函數

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. 
    } 
}; 

但現在我想有C類,有方法foo(),與唯一區別調用C :: bar()到底:

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 
    } 
} 

但是,在這裏我需要做方法A :: foo定義的完整副本。我也可以引入像virtual void callStaticBar(){bar();}這樣的虛擬虛擬方法,並在類C中用相同的文本覆蓋它。有沒有更優雅的方式來做這樣的事情?

回答

0

號如果C::foo()沒有定義,在一個C實例會真的叫A::foo()調用foo();因爲類A不知道類C(vtable的情況除外),所以A::foo()無法調用C::bar(),無論原始調用是否來自C實例。

您需要使用虛擬虛擬方法,或者告訴我們更多關於您想要實現的內容,因爲它們可能是特定情況下的更好解決方案。

+0

好吧,我想我明白了。 'A :: bar()'和'C :: bar()'是完全不同的函數,它們具有相同的名稱並不會改變這個事實。我不希望從'A :: foo()'調用'C :: other_bar()'而不重寫它,所以我不能用'C :: bar()'來做。 –