Pra*_*rav 2 c++ virtual constructor
可能重复:
为什么我们没有虚拟构造函数?
我知道之前已经问过这个问题,但我不理解其他答案中使用的复杂技术词汇.
我在社区上读到了构造函数不能虚拟的原因
"虚拟"机制适用于逻辑上完整(完全构造)的对象.我们知道我们使用构造函数来逻辑初始化对象.换句话说,在构造函数完成执行之前,对象尚未完全构造.因此,我们不能拥有虚拟构造函数.
有一种误解,到那时虚拟表是不完整的,所以我们不能拥有虚拟构造函数.在构造函数开始执行之前,正确构造了虚拟表,并将"this"指针传递给构造函数.而且,虚拟表机制是实现依赖的,并且在C++标准中找不到位置.因此,使用虚拟表概念争论这个问题是不合逻辑的.
现在,当构造函数完成执行任何其他函数时,可以是虚拟的.析构函数也不例外,因为它是一个函数.如果我们使用基类指针来引用派生类对象,使用它,然后删除它,则需要虚拟析构函数.如果我们有虚拟析构函数,使用'delete',从派生到基数开始调用一系列析构函数.但是,如果析构函数中没有"虚拟",则只调用基类析构函数(而不是派生类).这(可能)会在程序中产生不一致.
以上原因是否正确?答案没有谈论静态和动态类型的对象.
虚拟构造函数没有意义,也没有必要.您调用构造函数的唯一时间是创建对象时.您需要知道对象的类型才能创建它,因此静态和动态类型是相同的,并且要调用的正确构造函数是该类型的构造函数.
这就是他们没有必要的原因.为什么它们没有意义,就是在创建对象时,会调用基类构造函数以及派生类构造函数.如果在派生类中重写了基类构造函数,那是否应该意味着根本不调用基类构造函数?
其他语言具有虚拟构造函数,可能是因为这些语言中的构造函数是方法,并且它们仅具有非静态方法的虚拟调用.但是那些其他语言(Java和Python脑海中浮现)必须引入特殊的规则,构造函数必须/应该构造它们的基类作为来自构造函数的调用.C++就是这样做的(可能在初始化列表中,如果基类构造函数需要参数),使用非虚构造函数,并且没有选项可以使用未初始化的基类子对象输入构造函数的主体.