我想在兩個對象之間實現交互,這兩個對象的類型是從一個公共基類派生的。有一個默認的交互,並且一旦相同類型的對象進行交互,可能會發生特定的事情。 這是使用下面的雙重分派方案實施:Double dispatch產生「隱藏虛擬功能」警告,爲什麼?
#include <iostream>
class A
{
public:
virtual void PostCompose(A* other)
{
other->PreCompose(this);
}
virtual void PreCompose(A* other)
{
std::cout << "Precomposing with an A object" << std::endl;
}
};
class B : public A
{
public:
virtual void PostCompose(A* other) // This one needs to be present to prevent a warning
{
other->PreCompose(this);
}
virtual void PreCompose(A* other) // This one needs to be present to prevent an error
{
std::cout << "Precomposing with an A object" << std::endl;
}
virtual void PostCompose(B* other)
{
other->PreCompose(this);
}
virtual void PreCompose(B* other)
{
std::cout << "Precomposing with a B object" << std::endl;
}
};
int main()
{
A a;
B b;
a.PostCompose(&a); // -> "Precomposing with an A object"
a.PostCompose(&b); // -> "Precomposing with an A object"
b.PostCompose(&a); // -> "Precomposing with an A object"
b.PostCompose(&b); // -> "Precomposing with a B object"
}
我有一個關於這兩個代碼,不幸的是完全不同的問題:
- 你認爲這是一個合理的做法?你會建議不同的東西嗎?
- 如果我省略了前兩個
B
方法,則會收到編譯器警告和錯誤,最後兩個B
方法隱藏了A
方法。這是爲什麼?一個A*
指針不應該轉換爲B*
指針,還是應該這樣?
更新:我剛剛發現添加
using A::PreCompose;
using A::PostCompose;
使錯誤和警告消失,但爲什麼是這個必要嗎?
更新2:這裏整齊地解釋:http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9,謝謝。我的第一個問題呢?對此方法有何評論?
你應該真的把它分解成兩個問題。他們完全不相關。一方面你有一個查找問題,另一方面你有一個雙重調度問題,並且它們是完全不相關的。至於第一個問題:這種方法是有缺陷的。我已經提供了一個簡短的答案雙重調度(連同對查找問題的更長的答案),但我不知道它有多清楚...... – 2011-04-14 10:22:17
@dribeas:謝謝!我已經問過這個問題的雙重調度部分[這裏](http://stackoverflow.com/questions/4671517/c-double-dispatch-problems)。如果你能在那裏啓發我會很棒! – lytenyn 2011-04-14 11:57:21