多重继承虚拟调用歧义

Pas*_* By 5 c++ polymorphism multiple-inheritance

手头的问题很难描述,所以代码放在前面以便更清晰.

struct Base
{
    int b;
    virtual void foo(){cout << b << endl;}
    Base(int x) : b(x){}
};

struct Derived1 : Base    //not virtual
{
    virtual void foo(){/*Derived2's code*/}
    Derived1() : Base(1){}
};

struct Derived2 : Base    //not virtual
{
    virtual void foo(){/*Derived2's code*/}
    Derived2() : Base(2){}
};

struct MultiInheritance : Derived1, Derived2
{
    void bar1()
    {
        //needs to access Derived1's Base foo()
    }
    void bar2()
    {
        //needs to access Derived2's Base foo()
    }
};
Run Code Online (Sandbox Code Playgroud)

假设在一些奇怪的奇怪场景中,我希望有一个基类MultiInheritance,它有两个基类Derived1,Derived2并且有一个共同的非虚基类Base.

有两个BaseMultiInheritance,我怎么指定Base我希望在访问班MultiInheritance

上面的代码似乎可以通过多次转换来正常工作,但我不确定这是否是已定义的行为.如果是,编译器如何实现多态性的需求呢?一方面virtual调用应该都导致相同的virtual函数表,但另一方面,如果它发生,它将不会输出不同的答案.

编辑

我想强调的是,这些Base类必须是非虚拟的

EDIT2

深表歉意,我严重歪曲自己.上面的代码更新更好地反映了我原来的问题.

n. *_* m. 0

这是一个更具说明性的示例。

#include <iostream>
using namespace std;

template <typename Res, typename Arg>
Res& as(Arg& arg)
{
  return arg;
}

struct Base
{
    virtual void foo() = 0;
};

struct Derived1 : Base {};
struct Derived2 : Base {};

struct MoreDerived1 : Derived1
{
    void foo() { cout << "Derived1\n"; }
};

struct MoreDerived2 : Derived2
{
    void foo() { cout << "Derived2\n"; }
};

struct MultiInheritance : MoreDerived1,  MoreDerived2
{
    void bar1() { as<Derived1>(*this).foo(); }
    void bar2() { as<Derived2>(*this).foo(); }
};

int main ()
{
     MultiInheritance m;
     m.bar1();
     m.bar2();
}
Run Code Online (Sandbox Code Playgroud)

这个例子说明:

  1. 您不需要使用完整继承路径显式指定您需要哪个 Base,只需深入到具有明确 Base 子对象的子对象就足够了
  2. 虚函数机制在这里起作用。如果您尝试拨打电话,则不会成功Derived1::foo()

辅助as函数只是一个语法糖,你也可以说

Derived1& d = *this;
d.foo();
Run Code Online (Sandbox Code Playgroud)