標題可能令人困惑。從不同的基類中重載相同名稱的虛函數。可能嗎?
假設我們有以下設置;
class A
{
public:
virtual void fn() = 0;
};
class B
{
public:
virtual int fn() {};
};
class C: public A, public B
{
};
有什麼辦法來定義class C
A::fn
?
標題可能令人困惑。從不同的基類中重載相同名稱的虛函數。可能嗎?
假設我們有以下設置;
class A
{
public:
virtual void fn() = 0;
};
class B
{
public:
virtual int fn() {};
};
class C: public A, public B
{
};
有什麼辦法來定義class C
A::fn
?
否。這不可能。它將始終與fn()
中的任何一個衝突。
的fn()
語法是不同的,
void fn(); // in A
和B
是,
int fn(); // in B
你必須讓那些語法同樣在A
和B
讓C
實施fn()
。 Demo。
有沒有辦法在C
來指定C::fn()
實現的一個重載A::fn()
(大概另一重載 B::fn()
)。你能做什麼,但是,是引入一箇中間 類「重命名」的功能,像:
class RemapA : public A
{
virtual void fnInA() = 0;
public:
virtual void fn()
{
fnInA();
}
};
class RemapB : public B
{
virtual int fnInB() = 0;
public:
virtual int fn()
{
return fnInB();
}
};
class C : public RemapA, public RemapB
{
virtual void fnInA() { /* ... */ }
virtual void fnInB() { /* ... */ }
// ...
};
您可能需要閱讀我的回答以下問題:Implement two functions with the same name but different, non-covariant return types due to multiple abstract base classes 簡而言之:是的,調用它的一些限制。它可以被稱爲A(指針或引用)或B(指針或引用),但不能被當作C來使用,因爲這可能是不明確的。