我有这个代码在使用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
的多个定义吗?
我试图以额外的函数定义为代价来避免虚拟继承,我的主要观点是确认这是否适用于所有编译器?