2012-03-10 85 views
0

我有一個繼承另一個類(A)的類(B)。我想從類A中調用已被覆蓋的函數。我也希望能夠調用重寫的功能獨立的什麼類繼承的基礎(比如class C : public A,在這裏我要調用C版的功能。)如何從基類中的函數調用重載函數?

下面是一個例子

class A { 

public: 
    void callF(); 
    virtual void f() {}; 
}; 

class B : public A { 

public: 
    void f(); 
}; 

void A::callF() 
{ 
    //FYI, I want to be able to call this without knowing what the super class is. 
    f(); 
} 

void B::f() 
{ 
    std::cout << "I want this function to be called, but instead the default f() is called."; 
} 

編輯: 在我的真實密碼中,我有一個std::vector<A> aVector;。然後我會打電話給aVector.push_back(B());。如果我撥打aVector[0].callF();,則會調用默認的a::f()。 正如以下回答,我有一個切片問題。

+0

請澄清一下你的問題。您希望能夠在從基類調用重寫函數f()時調用它。在上面的示例中,當您在類A中調用f()時,您希望調用B中的重寫函數。是這樣嗎? – Gangadhar 2012-03-10 02:29:56

+0

這是正確的。另外,假設我實現了繼承A的'C類'。當我調用'C c; c.callF()',我希望它調用C的f()版本。 – sFuller 2012-03-10 02:34:37

+0

而且你會...... – 2012-03-10 02:38:16

回答

1

您的建築:

vector_of_A.push_back(B()); 

不存儲B的載體。它構造一個B,然後從那裏構造一個A,然後在該向量中存儲A。因此,您將體驗切片。

更多信息請參閱本:

https://stackoverflow.com/a/4403759/8747

0

您的代碼對我的作品與這個小測試程序:

int main() 
{ 
    // Instantiate B, and reference it via a base class pointer. 
    A* b = new B; 

    b->callF(); 
    delete b; 
} 

輸出:

I want this function to be called, but instead the default f() is called. 

當調用基類成員函數中的虛成員函數,它的派生成員函數將被調用。

+0

@sFuller請閱讀http://sscce.org,特別是那些說「確保你發佈的代碼顯示問題!」的部分。 – 2012-03-10 02:44:53

+0

啊,你的問題很常見,被稱爲**切片**。我敢肯定,其他回答者會比我更快地解釋你的問題,因爲我沒有快速的忍者技能。請修改您的問題,並在我的答案中粘貼剛發佈的評論。 – 2012-03-10 02:45:40