Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2400024
  • 博文数量: 328
  • 博客积分: 4302
  • 博客等级: 上校
  • 技术积分: 5486
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-01 11:14
个人简介

悲剧,绝对的悲剧,悲剧中的悲剧。

文章分类

全部博文(328)

文章存档

2017年(6)

2016年(18)

2015年(28)

2014年(73)

2013年(62)

2012年(58)

2011年(55)

2010年(28)

分类: C/C++

2014-11-20 23:31:39

一个经常发生的和继承有关的类似问题是在实现派生类的拷贝构造函数时。看看下面这个构造函数:

  1. class base {
  2. public:
  3.   base(int initialvalue = 0): x(initialvalue) {}
  4.   base(const base& rhs): x(rhs.x) {}

  5. private:
  6.   int x;
  7. };

  8. class derived: public base {
  9. public:
  10.   derived(int initialvalue)
  11.   : base(initialvalue), y(initialvalue) {}

  12.   derived(const derived& rhs) // 错误的拷贝
  13.   : y(rhs.y) {} // 构造函数

  14. private:
  15.   int y;
  16. };

类derived展现了一个在所有c++环境下都会产生的bug:当derived的拷贝创建时,没有拷贝其基类部分。当然,这个derived对象的base部分还是创建了,但它是用base的缺省构造函数创建的,成员x被初始化为0(缺省构造函数的缺省参数值),而没有顾及被拷贝的对象的x值是多少!

为避免这个问题,derived的拷贝构造函数必须保证调用的是base的拷贝构造函数而不是base的缺省构造函数。这很容易做,只要在derived的拷贝构造函数的成员初始化列表里对base指定一个初始化值:

  1. class derived: public base {
  2. public:
  3.   derived(const derived& rhs): base(rhs), y(rhs.y) {}
  4.   ...
  5. };

现在,当用一个已有的同类型的对象来拷贝创建一个derived对象时,它的base部分也将被拷贝了。
阅读(8177) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~