子类的拷贝构造函数如何调用其父类的拷贝构造函数
来源:互联网 发布:吹风机推荐 知乎 编辑:程序博客网 时间:2024/05/22 00:06
class base {
public:
base(int initialvalue = 0): x(initialvalue) {}
base(const base& rhs): x(rhs.x) {}
private:
int x;
};
class derived: public base {
public:
derived(int initialvalue)
: base(initialvalue), y(initialvalue) {}
derived(const derived& rhs) // 错误的拷贝
: y(rhs.y) {} // 构造函数
private:
int y;
};
类derived展现了一个在所有c++环境下都会产生的bug:当derived的拷贝创建时,没有拷贝其基类部分。当然,这个derived对象的base部分还是创建了,但它是用base的缺省构造函数创建的,成员x被初始化为0(缺省构造函数的缺省参数值),而没有顾及被拷贝的对象的x值是多少!
为避免这个问题,derived的拷贝构造函数必须保证调用的是base的拷贝构造函数而不是base的缺省构造函数。这很容易做,只要在derived的拷贝构造函数的成员初始化列表里对base指定一个初始化值:
class derived: public base {
public:
derived(const derived& rhs): base(rhs), y(rhs.y) {}
...
};
现在,当用一个已有的同类型的对象来拷贝创建一个derived对象时,它的base部分也将被拷贝了。
public:
base(int initialvalue = 0): x(initialvalue) {}
base(const base& rhs): x(rhs.x) {}
private:
int x;
};
class derived: public base {
public:
derived(int initialvalue)
: base(initialvalue), y(initialvalue) {}
derived(const derived& rhs) // 错误的拷贝
: y(rhs.y) {} // 构造函数
private:
int y;
};
类derived展现了一个在所有c++环境下都会产生的bug:当derived的拷贝创建时,没有拷贝其基类部分。当然,这个derived对象的base部分还是创建了,但它是用base的缺省构造函数创建的,成员x被初始化为0(缺省构造函数的缺省参数值),而没有顾及被拷贝的对象的x值是多少!
为避免这个问题,derived的拷贝构造函数必须保证调用的是base的拷贝构造函数而不是base的缺省构造函数。这很容易做,只要在derived的拷贝构造函数的成员初始化列表里对base指定一个初始化值:
class derived: public base {
public:
derived(const derived& rhs): base(rhs), y(rhs.y) {}
...
};
现在,当用一个已有的同类型的对象来拷贝创建一个derived对象时,它的base部分也将被拷贝了。
0 0
- 子类的拷贝构造函数如何调用其父类的拷贝构造函数
- 拷贝构造函数调用父类的构造函数
- 拷贝构造函数的调用
- 拷贝构造函数的调用
- 类的构造函数、拷贝构造函数
- 函数调用 中 的拷贝构造函数
- 构造函数的拷贝
- 【C++】基类与子类拷贝构造函数的调用顺序
- C++ 拷贝构造函数的调用
- 拷贝构造函数调用的时机
- [C++] 拷贝构造函数的调用
- 拷贝构造函数被调用的时机
- Java:拷贝构造函数的调用
- c++拷贝构造函数的调用时机
- 拷贝构造函数被调用的时机
- 调用拷贝构造函数的时机
- 拷贝构造函数被调用的情形
- 拷贝构造函数被调用的时机
- Carthage:去中心化的Cocoa依赖管理器
- 使用JS制作简易图片轮播效果
- 用c语言实现 猴子吃桃问题
- 【三石jQuery视频教程】01.图片循环展示_重发
- 第三周 项目一-三角形类一
- 子类的拷贝构造函数如何调用其父类的拷贝构造函数
- STL—容器知识总结
- 访问:172652次 积分:3200 等级: 排名:第4396名 原创:160篇 转载:51篇 译文:5篇 评论:10条
- 精通Perl(第2版)
- public、private、protected、default的区别
- [算法题] 汉诺塔问题
- JZ2440下DM9000C网卡驱动问题的解决方法
- (2.1.5)内部类和匿名内部类
- Eclipse编译JNI头文件