【发布时间】:2014-05-28 05:13:26
【问题描述】:
以下代码崩溃(访问冲突错误),因为我使用了虚拟继承。
AFAIK 虚拟继承通过强制使用类的单个实例来解决 Diamond 问题。在这种情况下,Derived 类只继承了IObject 的一个实例,所以应该没有问题,但是它崩溃了。
class IObject
{
public:
virtual int getType()=0;
};
class Base : public IObject
{
protected:
int val;
public:
Base() { val = 1; }
virtual int getType();
};
int Base::getType() { return val; }
class Derived : public virtual Base //If I remove the virtual keyword here problem is solved.
{
public:
Derived() { val = 2; }
};
int getVal( void* ptr )
{
return ((IObject*)ptr)->getType();
}
int main()
{
void* ptr = new Derived();
cout << getVal(ptr) << endl;
return 0;
}
【问题讨论】:
-
为什么要使用虚拟继承?
-
我没有。我正在重构我的代码,最终虚拟继承变得不必要了。但是在崩溃发生之前我没有注意到它,然后我将其删除。我仍然对原因感到好奇。
-
这里没有钻石问题!!!
-
@barakmanos 我知道。我不明白为什么它会导致崩溃。
-
您的代码运行良好,当我尝试使用 IObject* 而不是 void 并删除了强制转换时。我试过 VS2010 和 Ideone C+11
标签: c++ visual-studio visual-studio-2008 crash virtual-inheritance