这个多继承代码是否适用于所有编译器?

时间:2017-08-01 05:43:00

标签: c++ virtual-functions diamond-problem

我有这个代码在使用Visual Studio编译时工作正常。

#include "stdafx.h"

class base
{
public:
    virtual void FOO() = 0;
};

class D1:public base
{
public:
    virtual void bar() =0;
};

class D2:public base
{
public:
    virtual void moo() =0;
};

class Impl: public D1, public D2
{
public:
    virtual void FOO()
    {}
    virtual void bar()
    {}
    virtual void moo()
    {}
};

int _tmain(int argc, _TCHAR* argv[])
{
    Impl* p = new Impl();
    p->bar();
    p->FOO();
    base *b = (D1*)p;
    b->FOO();
    return 0;
}

你可以看到这里有一个钻石问题但是,我仍然可以用Impl的一个定义创建FOO的对象。我以为我需要来自基类的多个定义。有人可以解释一下这里会创建多少个vtable,编译器会自己创建FOO的多个定义吗?

我试图以额外的函数定义为代价来避免虚拟继承,我的主要观点是确认这是否适用于所有编译器?

0 个答案:

没有答案