派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行;
构造的顺序是: 基(base) -> 派生(derived);即先构造基类, 再构造派生类;
因为 基类 是独立于派生类的, 即不会调用派生类中的对象, 所以应该先被生成;
如果派生类先于基类生成, 则因为无法调用基类资源, 可能生成失败;
析构的顺序是: 派生(derived) -> 基(base); 即先释放派生类, 再释放基类;
因为 派生类 需要先释放调用的基类资源, 所以应该优先释放;
如果基类先析构, 则有可能某些资源被派生类占用, 可能导致析构失败;
派生类的构造和析构顺序正好相反;
代码:
/* * CppPrimer.cpp * * Created on: 2013.11.12 * Author: Caroline */ /*eclipse cdt*/ #include <iostream> #include <string> #include <vector> #include <memory> #include <cstddef> using namespace std; class Quote { public: //Quote() = default; Quote() { std::cout << "this is Quote constructor" << std::endl; } Quote (const std::string& book, double sales_price) : bookNo (book), price (sales_price) {} std::string isbn() const { return bookNo; } virtual double net_price (std::size_t n) const { return n* price; } //虚函数 //virtual ~Quote() = default; //动态绑定析构器 virtual ~Quote() { std::cout << "this is Quote destructor" << std::endl; } private: std::string bookNo; protected: //受保护类型 double price = 0.0; }; /*更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/cplus/*/ class Disc_quote : public Quote { //抽象基类 public: //Disc_quote() = default; Disc_quote() { std::cout << "this is Disc_quote constructor" << std::endl; } Disc_quote (const std::string& book, double price, std::size_t qty, double disc) : Quote(book, price), quantity (qty), discount (disc) {} double net_price (std::size_t) const = 0; //纯虚函数 virtual ~Disc_quote() override{ std::cout << "this is Disc_quote destructor" << std::endl; } protected: std::size_t quantity = 0; double discount = 0.0; }; class Bulk_quote final : public Disc_quote { //final限定词, 无法被继承 public: //Bulk_quote() = default; Bulk_quote() { std::cout << "this is Bulk_quote constructor" << std::endl; } Bulk_quote(const std::string& book, double p, std::size_t qty, double disc) : Disc_quote(book, p, qty, disc) {} //使用基类的构造器 double net_price(std::size_t cnt) const override; virtual ~Bulk_quote() override{ std::cout << "this is Bulk_quote destructor" << std::endl; } }; double Bulk_quote::net_price(std::size_t cnt) const { if (cnt >= quantity) return cnt * (1-discount) * price; else return cnt * price; } double print_total(std::ostream &os, const Quote& item, std::size_t n) { double ret = item.net_price(n); os << "ISBN: " << item.isbn() << " # sold: " << n << " total due: " << ret << std::endl; return ret; } int main (void) { Bulk_quote* bq = new Bulk_quote; delete bq; return 0; }
输出:
this is Quote constructor this is Disc_quote constructor this is Bulk_quote constructor this is Bulk_quote destructor this is Disc_quote destructor this is Quote destructor
作者:csdn博客 Spike_King
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索include
, 派生类
, 派生
, 生成
, 资源
顺序
构造和析构的顺序、派生类的析构函数、派生类析构函数、派生类 虚析构函数、构造函数和析构函数,以便于您获取更多的相关知识。
时间: 2024-08-02 16:49:56