当我翻阅时,我发现了这个问题。
#include <iostream>
using namespace std;
class base
{
public:
base()
{
cout << "ctor in base class\n";
}
};
class derived1 : public base
{
public:
derived1()
{
cout <<"ctor in derived class\n";
}
};
int main()
{
derived1 d1obj;
return 0;
}有一个问题:-当创建d1obj时,控件首先到达基类构造函数,然后转到派生类构造函数?或者是相反的情况:它首先到达派生类构造函数,发现它有基类,因此控件转到基类中的构造函数?
而这个系统包含了部分
当类具有虚拟基时,构造函数通常会导致两个不同的函数体被发出--一个用于这个类是派生最多的类型,另一个用于这个类本身是一个基类。原因是虚拟基类是由派生最多的类构造的,以确保当它们被共享时只构造一次。因此,构造函数的第一个版本将调用所有基类构造函数,而第二个版本只调用非虚拟基的构造函数。。
有人能举个例子向我解释一下吗?
Here是这个问题的链接
发布于 2017-04-05 08:06:10
在您的示例中,负责调用derived1的默认构造函数的是base的默认构造函数。但是,只有当derived1是实际的(大部分派生的)对象时,这才是必要的,如您的示例所示
int main()
{
derived1 d1obj; // Most derived object of type `derived1`
// It contains a direct `base` subobject
// Constructor of `derived1` must construct `base` subobject as well
} 但是当使用derived1时,一个较大对象的基子对象
class derived2 : public derived1
{
public:
derived2()
{
cout <<"ctor in derived 2 class\n";
}
};
int main()
{
derived2 d2obj; // Most derived object of type `derived2`
// It contains a direct `derived1` subobject and an indirect `base` subobject
// (through `derived1`)
// Constructor of `derived2` must directly construct both `derived1` subobject and
// `base` subobject
// Which means that constructor of `derived1` subobject should not attempt
// to construct `base` subobject
}然后,derived2的构造函数负责调用derived1的默认构造函数和默认的构造函数base。在这种情况下,derived1的默认构造函数不应调用base的构造函数,因为它将导致base的双重构造。
为了满足所有这些要求,derived1通常有两个版本的默认构造函数:原始示例中调用的完整版本和上面示例中从derived2调用的“缩减”版本。
或者,derived1的默认构造函数可以使用隐藏的布尔参数来实现,这将告诉它是否调用base的默认构造器。
发布于 2017-04-05 06:43:19
“当类具有虚拟基时,构造函数通常会产生两个不同的函数体--一个用于这个类是派生最多的类型时使用,另一个用于这个类本身是一个基类。原因是虚拟基类是由派生最多的类构造的,以确保当它们共享时只构造一次。因此构造函数的第一个版本将调用所有基类构造函数,而第二个版本只调用非虚拟基的构造函数。”
在这种情况下,回答者实际上想说的是C++中常见的一种情况,即多重继承中的可怕钻石。要理解这个链接,只需查看对此链接In C++, what is a virtual base class?最不满意的答案
https://stackoverflow.com/questions/43223348
复制相似问题