zoukankan      html  css  js  c++  java
  • 子类的拷贝构造函数如何调用其父类的拷贝构造函数

    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部分也将被拷贝了。
  • 相关阅读:
    集合的笼统介绍之Collection
    集合的笼统介绍之ArrayList
    final关键字+static关键字+匿名对象
    多态
    练习018:搜索插入位置
    练习017:实现strStr()
    练习016:移除元素
    练习015:删除排序数组中的重复项
    练习014:合并两个有序链表
    用JS实现链表
  • 原文地址:https://www.cnblogs.com/vigorz/p/10499230.html
Copyright © 2011-2022 走看看