我试过这段代码:
class A
{
virtual void foo() = 0;
};
class B
{
virtual void foo() = 0;
};
class C : public A, public B
{
//virtual void A::foo(){}
//virtual void B::foo(){}
virtual void A::foo();
virtual void B::foo();
};
void C::A::foo(){}
void C::B::foo(){}
int main()
{
C c;
return 0;
}
使用注释部分是可以的,但是当我尝试在类声明之外编写定义时,编译器会报告错误。我正在使用 MSVC11 编译器,有人知道如何编写吗?我需要将代码移动到 cpp 文件中。
谢谢~~
原文由 watson 发布,翻译遵循 CC BY-SA 4.0 许可协议
函数根据名称和参数类型覆盖基类的虚函数(见下文)。因此,你的类
C
有 两个 虚函数foo
,从每个继承一个A
和B
但是函数void C::foo()
会覆盖 _两者_:[class.virtual]/2
正如我在评论中已经说过的,[dcl.meaning]/1 禁止在(成员)函数的声明中使用 限定 ID :
因此,任何
virtual void X::foo();
作为C
中的声明都是非法的。编码
是 AFAIK 覆盖
foo
的唯一方法,它将覆盖A::foo
和B::foo
。除了引入另一层继承之外,没有办法对A::foo
和B::foo
有两种不同的覆盖: