我知道這個問題必須被覆蓋無盡的時間,但我已經搜索了以前的問題,沒有任何東西似乎彈出。在超類的子類中調用虛函數
這是關於繼承和虛函數我C++。我在調用超類的子類中的虛函數時遇到了問題。
讓我舉個例子。從三個類開始,它們相互繼承。
class A {
void foo() { bar() }
virtual void bar() { }
};
class B : public A {
virtual void bar() { }
};
class C : public B {
virtual void bar() { // do something }
};
現在我想要一個聲明爲B *的變量,但實例化爲C *。當我這樣做,並在myObject上調用foo(),然後A :: foo()調用bar()。但是隻調用B :: bar(),而不是C :: Bar() - 實際上myObject是這樣的,即使它被聲明爲B,這又會影響「//不做任何事」不會被執行。
我該如何告訴A :: foo(),它需要看最低的實現?
有意義嗎?
// Trenskow
編輯:
Ç:: foo是沒有問題的。 Foo被稱爲A級,因爲它是唯一實施的地方。問題出現時,A:Foo調用Bar()。然後B:Bar被調用,而不是C :: Bar。
也許問題是,在我的實現,我只得到一個void *指針對象A.
像這樣:
void A:Foo(void *a) {
A* tmpA = static_cast<A*> (a);
tmpA->bar();
}
現在,編譯器認爲,這TMPA是答:但不知何故,它設法確定它是一個B *,並且調用B :: Bar,實際上tmpA是一個C *,它應該調用C :: Bar。
如果你發佈了真實的代碼,那麼我們可以告訴問題是。你不需要做任何特別的事情。如果語法錯誤得到解決,代碼('myObject-> foo();')將調用'C :: bar()'。 – UncleBens 2010-08-22 09:23:20
......但是如果我猜測,要麼'C'並沒有真正覆蓋'bar'(具有不同的簽名),或者你在某處切分對象(通過執行諸如'* variable = * myObject;' – UncleBens 2010-08-22 09:33:21
我仍然不會購買它,爲什麼不調用C :: bar()?你能發佈實際的代碼嗎? – EboMike 2010-08-22 09:43:17