标题可能令人困惑。
假设我们有以下设置;
class A
{
public:
virtual void fn() = 0;
};
class B
{
public:
virtual int fn() {};
};
class C: public A, public B
{
};
有没有办法在A::fn
中定义class C
?
答案 0 :(得分:4)
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() { /* ... */ }
// ...
};
答案 1 :(得分:1)
否即可。这是不可能的。它始终与fn()
。
fn()
的语法不同,
void fn(); // in A
并在B
中,
int fn(); // in B
您必须在A
和B
中使这些语法相同,才能让C
实现fn()
。 Demo
答案 2 :(得分:1)
您可能希望阅读我对以下问题的回答:Implement two functions with the same name but different, non-covariant return types due to multiple abstract base classes 简而言之:是的,在调用它时有一些限制。它可以被称为A(指针或引用)或B(指针或引用),但不能被称为C,因为它是不明确的。