函数根据名称和参数类型覆盖基类的虚函数(见下文)。因此,您的类C
有两个虚函数foo
,一个继承自A
和B
。但是一个函数void C::foo()
会覆盖两者:
[class.virtual]/2
如果在一个类和一个类中vf
声明了一个虚成员函数,直接或间接地派生自一个与被声明,然后也是虚拟的(无论它是否被声明)并且它覆盖.Base
Derived
Base
vf
Base::vf
Derived::vf
Base::vf
正如我在评论中已经说过的,[dcl.meaning]/1 禁止在(成员)函数的声明中使用限定 ID :
当declarator-id被限定时,该声明应引用该限定符所引用的类或命名空间的先前声明的成员 [...]"
因此任何virtual void X::foo();
作为里面的声明都是非法的C
。
编码
class C : public A, public B
{
virtual void foo();
};
是 AFAIK 覆盖的唯一方法foo
,它将同时覆盖A::foo
和B::foo
。除了引入另一层继承之外,没有办法为不同的行为A::foo
提供两种不同的覆盖:B::foo
#include <iostream>
struct A
{
virtual void foo() = 0;
};
struct B
{
virtual void foo() = 0;
};
struct CA : A
{
virtual void foo() { std::cout << "A" << std::endl; }
};
struct CB : B
{
virtual void foo() { std::cout << "B" << std::endl; }
};
struct C : CA, CB {};
int main() {
C c;
//c.foo(); // ambiguous
A& a = c;
a.foo();
B& b = c;
b.foo();
}