假设我有一个基类“人”.我公开地从基类“人”继承了一个班级“学生”.我还没有为base和派生类编写复制构造函数.现在假设我在主程序中写道 main(){student sobj1("name", "computer science");
main() { student sobj1("name", "computer science"); student sobj2=sobj1; }
现在在第二行中,将调用学生的默认编译器生成的复制构造函数但在执行之前将调用基类的默认复制构造函数,它创建一个匿名对象并初始化它然后控制返回到复制构造函数学生初始化学生的对象部分.
这是我们不编写复制构造函数的情况的演示
现在假设我们为这两个类编写了复制构造函数,然后我在编写时测试了它
student sobj2=sobj1;
会发生什么,这行调用学生的复制构造函数,但是在这种情况下不会调用基类的复制构造函数(基类的默认构造函数将被调用)我的问题是为什么?
我相信规则如下:>基类的构造函数总是应该在派生类的构造函数之前调用.
>您可以通过在初始化列表中显式调用它来选择将调用哪个基类构造函数.
>如果不这样做,则调用默认构造函数.
>当类没有复制构造函数时,编译器会生成一个复制构造函数.它将为类的所有成员调用默认构造函数并复制基类的构造函数,就像您手写的构造函数实际应该的那样.
所以,你去吧.除非你调用基类的复制构造函数,否则将使用默认的BUT编译器足够聪明,可以在它自己生成的复制构造函数中实际调用它.
以防你不知道如何调用它,例如
Student(Student const & p): Person(p) { }