当前位置:首页 >> 编程开发 >> Visual C++ >> 内容

C++中派生类的构造和析构顺序详解

时间:2014/11/20 作者:平凡之路 来源:xuhantao.com 浏览:

派生类因为要调用基类, 所以构造和析构都是按照一定顺序进行;

构造的顺序是: 基(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.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

相关文章
  • 没有相关文章
  • 徐汉涛(www.xuhantao.com) © 2024 版权所有 All Rights Reserved.
  • 部分内容来自网络,如有侵权请联系站长尽快处理 站长QQ:965898558(广告及站内业务受理) 网站备案号:蒙ICP备15000590号-1