[英]About constructor call for base and derived class
我是C ++的新手,我刚开始研究多态性。 我知道如果我为派生类创建一个对象,那么派生和基类的构造函数都会被调用。 这是否意味着,当我为派生类创建一个对象时,最终我得到了两个对象 - 一个是由基类的构造函数创建的,另一个是由派生类的构造函数创建的?
任何人都可以解释一下,当我想为派生类创建一个对象时,基类构造函数的作用是什么。
基类构造函数的工作是初始化基类成员变量(考虑基类中private
成员变量的情况)。
当您为派生对象调用构造函数时,您最终只能得到一个对象。 基类构造函数初始化新对象的基类部分,派生构造函数初始化同一新对象的派生类部分。
构造函数不分配空间并启动对象实例; 它们在分配空间后立即初始化对象。
当您在堆栈上声明对象或首先使用new时 ,将保留内存并创建对象,然后执行构造函数,从基础构造函数开始并向上朝向最派生类。
最终将得到一个包含基类对象的派生类对象。
构造函数不会神奇地创建另一个对象实例。 它们初始化一段内存,但调用构造函数和分配内存不是一回事 - 后者要么在幕后完成(对于具有自动和静态存储持续时间的对象),要么使用new
和malloc
(对于具有动态的对象)储存期限)。
编辑:在我生气的评论之前:“在幕后”是一种模糊的方式来表达它; 具有自动或静态存储持续时间的对象的定义可确保它获得内存。
无论是创建base class
的object
还是derived class
,最终都会得到一个对象。
仅仅因为调用了基类构造函数,它并不意味着您为该调用获得了一个额外的对象。 这里,将执行b ase class constructor
,它通常设置基类的属性。 整个对象将由基类属性和派生类属性组成。
当创建派生类的对象时,首先创建该类的构造函数,然后使用基类的构造函数,在调用它时将由一个单独的对象调用它将被该对象调用。
如果你有一个类,那么你必须定义一个构造函数或构造函数(在某些情况下你不需要)。 构造函数的目的是初始化类数据成员,为其数据成员赋值。 除非数据成员是恰好具有默认构造函数的类的实例,否则您没有为其赋值的任何数据成员都将具有未定义的值。
因此,当您创建该类的实例时,编译器将调用相应的构造函数,并且您刚刚创建的实例的成员将在构造函数中设置时使用值初始化数据。
如果您有派生类,则可以向其添加数据成员,但请记住它还有一个继承成员:基类。 因此,当您在派生类中定义构造函数时,必须调用基类的构造函数(以便基类的成员完全初始化)并将值赋给派生类自己的数据成员。
因此,您创建派生类的实例,派生类构造函数是invoved。 作为其功能的一部分,它调用其基类的构造函数(所以你可能会说两个构造函数,但这是查看它的错误)。
如果创建基类的实例,则仅调用该构造函数。
当我们创建一个对象时,将调用构造函数。 它不是在创建名为object的构造函数时。
您可以假设将对象创建为函数,而构造函数是在其中调用的另一个函数。
假设A是基类,B是派生类,
A级{
}
B级:公共A {
}
我们将以下面的方式为A类创建对象,
A obja;
or
A obja = new A();
在这两种情况下,你可以假设一个函数Create被调用,
A::Create()
{
A();
}
如果要创建Derived类B对象,则将调用B的Create方法,
所以B的内部Create方法如下所示,
B::Create()
{
B();
A();
}
所以当我们创建Derived类对象时,首先发生派生类初始化,然后发生Base类初始化。 这并不意味着对象被创建了两次。
将为您使用创建对象的调用创建对象。
B obj;
要么
B obj = new B();
调用构造函数是在Create函数中调用的构造函数的内部功能。
注意:上述代码中的Create
函数仅用于说明目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.