多个虚拟继承歧义

时间:2011-12-19 12:58:26

标签: c++

可能最好用一个例子来解释:

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


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


struct C : A, B
{
    // Implementation of A::foo
    void A::foo();

    // Implementation of B::foo
    void B::foo();
};


// Define here; howto?

我知道我可以用类内联定义函数,但是在这个实例中这是不可行的(大约有6个基类用40多种方法实现)

-

显然我不够清楚。问题直接是:如何定义已被继承的foo()方法而不会引起歧义问题?

以下确实有效

void C::foo() { /* etc */ } 

这将定义A :: foo()的实现,还有B :: foo()的实现?请记住,我不希望在C的声明中定义方法。

P.S。,根据这种方式建模问题的原因是预定义的(COM / OLE)

-

这很好(MSVC)虽然内联:

struct A { virtual int foo() = 0; };
struct B { virtual int foo() = 0; };

struct C : A, B
{
    int A::foo() { return 1; }
    int B::foo() { return 2; }
};


void main()
{
    C* p = new C();

    cout << ((A*) p)->foo();
    cout << ((B*) p)->foo();
}

1 个答案:

答案 0 :(得分:1)

按预期工作:

struct A { virtual void foo() = 0; };
struct B { virtual void foo() = 0; };
struct C : A, B { virtual void foo(); };
void C::foo() { }

对于任何C x;static_cast<A&>(x).foo()static_cast<B&>(x).foo()将按预期调用x.foo(),这正是A和{{的纯虚拟接口1}}承诺。