C++ 使用虚拟继承和委托构造函数时构造函数崩溃
我得到了MSVC 2013编译器与上述代码崩溃。当使用GCC4.7.2编译时,它不会崩溃。下面描述了类的层次结构C++ 使用虚拟继承和委托构造函数时构造函数崩溃,c++,visual-c++,c++11,virtual-inheritance,delegating-constructor,C++,Visual C++,C++11,Virtual Inheritance,Delegating Constructor,我得到了MSVC 2013编译器与上述代码崩溃。当使用GCC4.7.2编译时,它不会崩溃。下面描述了类的层次结构 struct D { virtual void m() const = 0; }; struct D1 : public virtual D { }; struct D2 : public virtual D { }; struct B : public D2 { B() { } B(int val) : B() { } void m() c
struct D
{
virtual void m() const = 0;
};
struct D1 : public virtual D { };
struct D2 : public virtual D { };
struct B : public D2
{
B() { }
B(int val) : B() { }
void m() const { }
};
struct A : public B, public D1
{
A() : B(0) { }
};
int main()
{
A a;
return 0;
}
这是MS编译器中的错误,或者我在代码中犯了错误?据我所知,您的代码示例应该可以工作 不过,顺便说一句,您的构造函数委托可能被认为是不好的做法。您应该有一个完全定义的构造函数,所有定义较少的构造函数都委托给它,而不是反过来。例如:
D
/ \
D1 D2
| |
\ B
\ /
A
对MSVC++2013编译器生成的汇编代码的快速检查表明,从
B::B(int)
到B()
的委托调用不正确。这是编译器中的一个bug
MSVC++构造函数有一个隐藏的布尔参数,告诉构造函数它是在构造最派生的对象(true
)还是在构造嵌入的基子对象(false
)。在本例中,只有A::A()
应在该隐藏参数中接收true
,而所有较低级别的构造函数调用应接收false
。但是,当从B::B(int)
调用B()
时,编译器无条件地将1
(true
)作为隐藏参数传递。这是不正确的
struct B : public D2
{
B() : B(0) { }
B(int val) { }
void m() const { }
};
;`B::B(int)的代码`
...
00F05223推送1;在我看来,A代码>而不是D*D=新的A
也会出现错误。可能是这个错误:它在Mac OS上运行正常,并伴有叮当声。如果你真的想对此进行全面诊断,你可能需要生成汇编代码并深入研究。好奇。。现在我必须让vs 2013try@singh,这只是授权。这应该是合法的。
; Code for `B::B(int)`
...
00F05223 push 1 ; <- this is the problem
00F05225 mov ecx,dword ptr [this]
00F05228 call B::B (0F010F0h) ; <- call to `B::B()`
...