覆盖基类的虚函数,它们不共享公共接口

Joh*_*ohn 13 c++ virtual overriding multiple-inheritance

#include <iostream>
struct B1
{
    virtual void method()=0;
    virtual ~B1(){}
};

struct B2
{
    virtual void method()=0;
    virtual ~B2(){}
};

struct D: B1, B2
{
    virtual void method()
    {
        std::cout << "D::method\n";
    };
};

int main(int argc,char *argv[])
{
    D d;
    B1 &b1=d;
    B2 &b2=d;
    b1.method();
    b2.method();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意,B1和B2不共享通用接口.

这合法吗?如果是 - 在哪个标准?C++ 98/03/11?

msvc和gcc都编译好了.

以前我想过,我必须使用一些通用接口来处理这种情况(可能的虚拟继承).

这种情况有什么特别的名字吗?

请问它的工作原理如何?也许一些ISO参考?

Jam*_*lis 7

您的代码格式正确: void D::method()覆盖void B1::method()void B2::method().

规范陈述(C++11§10.3/ 2):

如果虚拟成员函数vf在类Base和类中声明Derived,直接或间接地从具有相同名称Base的成员函数派生vf,参数类型列表,cv限定和ref-qualifier(或不存在相同)Base::vf声明,然后Derived::vf也是虚拟的(无论是否声明)并覆盖它Base::vf.

B1声明一个虚拟成员函数void B1::method().类D派生自B1并且它还声明了具有相同名称(method),相同参数列表(无参数),相同cv资格(无资格)和相同ref-qualifier(无资格)的成员函数.

因此,void D::method()覆盖void B1::method().

相同的逻辑适用于void B2::method()(只是替换B2B1在上述的说明),因此void D::method()将覆盖这两个void B1::method()void B2::method().