C++派生类的复制构造函数的初始化为什么用基类,而不是派生类对象 他的复制过程是怎样的

如题所述

你的问题提的有点模糊,大概你想问派生类复制构造函数的执行过程:
假设基类复制构造函数的原型为Base(const Base &b),
通过公有派生出的派生类复制构造函数的原型为Derived(const Derived &d);
则Derived类的复制构造函数的执行过程为:
Derived(const Derived &d):Base(d)//由于构造函数不能被继承,而且派生类不能直接访问基类的私有成员, 因此需要使用初始化列表来初始化基类的私有数据成员
{
//初始化Derived类声明中自己声明的数据成员
}追问

如果自己申明的数据成员是基类对象,那该怎么初始化(如果基类对象需要两个形参)

追答

你思考的这个问题很奇特。因为你说的这个关系很复杂--既继承基类,又包含它的对象,不过至今我还没遇到过这种关系,所以无法回答你。个人觉得,由于这种情况基本不会出现,你不必花过多心思。

现在假设基类声明为

class Base
{
private:
int a;
int b;
public:
Base()
{
a = 1;
b = 2;
}
virtual void Show() const
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
}
};
class Derived:public Base//公有继承
{
private:
Base cMem;//把基类对象作为派生类的成员
public:
Derived() {}// 默认构造函数--全部使用默认构造函数
Derived(int x, int y, const Base &b):Base(x, y), cMem(b)
//前两个参数用于初始化基类成员,后一个初始化派生类数据成员
{
}
}

这样的话,写一个小小的测试程序证明也是可以的,注意继承时访问权限就可以了。

温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2018-04-19
派生了在调用copy construct的时候是会先调用基类的copy construct函数。

我们可以将派生类对象看成是两部分,一部分是基类部分,另外一部分是派生类部分。《深度探索c++ 对象模型》中对基类和派生类对象的构造有详细的说明。

派生类在拷贝的时候就是先基类对象拷贝,然后再拷贝派生类对象部分。可以参考《c++ primer》本回答被网友采纳
第2个回答  2013-05-11
构造函数要初始化的?你到底想表达什么?最好把你有疑问的代码发上来追问

A 是基类,B是派生类
B (const B& b) :A(b) 不明白为什么这里是A(b)

追答

这不是“复制构造函数的初始化”,b这个成员是A类的吧,你不调用A类的构造函数,就不能对b这个成员进行初始化。

要生成一个派生类对象,必然要先把这个派生类的基类部分构造好,所以必然要调用基类构造函数的。如果你这里把A(b)这段删掉,那么将会调用A类的默认构造函数,如果A类没有默认构造函数,将会报错。

C++派生类的复制构造函数的初始化为什么用基类,而不是派生类对象...
则Derived类的复制构造函数的执行过程为:Derived(const Derived &d):Base(d)\/\/由于构造函数不能被继承,而且派生类不能直接访问基类的私有成员, 因此需要使用初始化列表来初始化基类的私有数据成员 { \/\/初始化Derived类声明中自己声明的数据成员 } ...

在c++中为什么基类不缺省构造时候派生类要调用基类构造函数进行初始化...
首先,C++本身就规定创建子类对象的时,先调用基类的构造函数,然后再调用自己类的构造函数。当我们的基类没有自己定义构造函数时候(就是系统默认的构造函数)时。创建子类对象会先默认调用基类的默认构造函数。但是,当我们的基类自己定义了构造函数,(可能定义了很多个)此时不会再自动生产默认构造。但是...

c++ 中规定:当派生类构造函数初始化时,必须同时对基类构造函数初始化...
构造一个对象是从内向外构造的,也就是先构造基类,再构造派生类。因此必须在派生类构造函数执行前先执行基类构造函数。你的那个例子因为构造函数都是最简单的无参数类型,所以无所谓,不需要额外明白的写出来,C++会默认帮你调用无参数的base()。实际上完整的写法应该是这样的:class follow { public:fo...

派生类对象的创建过程中基类部分是如何进行初始化 详细??
1 : 由于派生类对象中的基类对象部分是在派生类对象创建时首先被构造的,因此基类对象的数据成员的创建和初始化是先于派生类新增属性的创建和初始化的。如果基类对象的构造需要传递参数对它的数据成员进行初始化,则需要在派生类构造函数定义的初始化表中调用基类的构造函数,并将由派生类构造函数的参数表...

C++中派生类的构造函数怎么显式调用基类构造函数?
关于显示调用基类的构造函数,是不可行的。必须用初始化表的形式调用基类构造函数,才能正确的把子类继承下来的父类的成员初始化了。如果在子类构造函数体内显式调用了基类构造函数的话,那么该构造函数就会对一个在子类构造函数内存空间内的一个临时对象进行了初始化,因为没有取得正确的对象(子类对象)的...

派生类的拷贝构造函数问题:派生类的引用初始化基类的引用
公有继承: 派生类在任何地方都可以作为基类使用。保护继承: 派生类只可以在派生类成员函数、孙子类成员函数和友元函数内当做基类对象使用。私有继承: 派生类只能在派生类本身的成员函数以及友元函数内当做基类对象使用。C::C(C &c1):B(c1){…} 这段代码定义了派生类的拷贝构造函数, 然后调用了...

C++: 虚函数的多态性 只给指向派生类的基类指针使用,而如果基类对象直接...
C++默认通过对象名访问的方式是按值访问,不是按指针和引用。 按值会导致派生类对象在向基类转换时发生截断(即去掉派生类的部分,只保留基类部分)。按指针和引用访问方式不会导致截断问题,所以可以实现多态。大家都知道在C++里这个表达式:obj1 = obj2; (obj1 和 obj2 是某个类的对象的名字。)是...

...的基类成员初始化的工作也要由派生类的构造函数承担?
1.初始化:那么可想而知,最终构造子类对象时子类对这个变量的初始化起了作用(因为先基类构造函数对其初始化,后子类构造函数对其初始化,明白吧);2.不初始化:那么可想而知,子类不干初始化这变量的事了,所以基类构造函数的初始化就发挥了作用。总之,一句话,记住构造子类对象时,构造函数调用的...

...只执行了基类的析构函数,而没有执行派生类的析构函数?
因为你用point *p=new circle;创建的是父类指针p,只是它指向了一个新创建的子类型的对象。delete p销毁的是父类的指针,跟子类无关,所以不执行子类的析构;只有销毁子类指针时才先执行子类析构,再执行父类析构。你把point *p=new circle;改成circle *p=new circle;,销毁p时就会输出 executing...

...成员函数只能访问基类成员,而不能访问派生类的成员,有疑问?_百度...
首先,派生类的新成员不在基类的作用域内,那么如果基类想要访问派生类的新添加成员就必须只能是派生类对象的成员(情况1)或者派生类的静态数据成员(情况2)。其次,基类的定义必定是在派生类前面的,那么,基类要想使用派生类的新添加成员,必须对派生类作前置声明。而又因为仅有前置声明是不能定义实体...

相似回答