派生类的拷贝控制成员

class Base { /*........*/};
class D : public Base {
    public:
    //默认情况下,基类的默认构造函数初始化对象的基类部分
    //要想使用拷贝或移动构造函数,我们必须在构造函数初始值列表中
    //显示地调用该构造函数
    D(const D& d) : Base(d) //拷贝基类成员
        /*D的成员的初始值*/ { /*........*/}
    D(D&& d)::Base(std::move(d))    //移动基类成员
        /*D的成员的初始值*/ {/*。。。。。。。。。。。*/}


}

//D的这个拷贝构造函数很可能是不正确的定义
//基类部分被默认初始化,而非拷贝
D(cosnt D& d) /*成员初始值,但是没有提供基类初始值*/
    {/**。。。*/}

派生类赋值运算符

    //Base::operator=(const Base&)不会被自动调用
    D &D::operator=(const D &rhs)
    {
        Base::operator=(rhs);//为基类部分赋值
        //按照过去的方式为派生类的成员赋值
        //酌情处理自赋值及释放已有资源等情况
        return *this;
    }

派生类析构函数

class D : public Base {
public:
    //Base::~Base被自动调用执行
    ~D(){/*该处由用户定义清除派生类成员的操作*/}

};

继承的构造函数

class Bulk_quote : public Disc_quote{
    public:
    using Disc_quote::Disc_quote;//继承Disc_quote的构造函数
    double net_price(std::size_t)const;
};
 Bulk_quote(const std::string& book,double price,
            std::size_t qty,double disc):
            Disc_quote(book,price,qty,disc){}

容器与继承

vector<Quote> basket;
basket.push_back(Quote("0-201-82470-1",50));
//正确:但是只能把对象的Quote部分拷贝给basket
basket.push_back(Bulk_quote("0-201-54848-8",50,10,.25));
//调用Quote定义的版本,打印750,即15*$50
cout<<basket.back().net_price(15)<<endl;


在容器中放置(智能)指针而非对象

vector<shared_prt<Quote>> basket;

basket.push_back(make_shared<Quote>("0-201-82470-1",50));

basket.push_back(
    make_shared<Bulk_quote>("0-201-54848-8",50,10,.25));
//调用 Quote定义的版本;打印562.5 ,即在15 * &50中扣除掉折扣金额
cout<<basket.back()->net_price(15)<<endl;

你可能感兴趣的:(c++)