条款07:为多态基类声明virtual析构函数

条款07:为多态基类声明virtual析构函数
    (Declare destructors virtual in polymorphic base classes.)
   
内容:
    一看到这个条款,你可能立刻就会提出你的疑问来推翻这个结论:如果不为多态基类声明virtual析
构函数,会发生什么灾难?好,其实答案是:当delete掉一个指向子类对象的基类指针时,它的行为是不可
定义的----------指向derived部分没有被销毁,析构函数也没有被调用而基类部分通常会被销毁,这样
就造成了一个可怕的"局部销毁"对象,造成了资源泄露、数据结构被损坏、浪费调试时间的惨状!这肯定不
是你想要的结局.当然解决的办法就是为base class析构函数加上virtual.
    如果class当中没有virtual函数,通常表示它并不意图被当做base class,而你为它强行加上virt-
ual析构函数的话,可能会造成不好的后果.书上的一个例子是:
    class SpecialString:public std::string{ //std::string有个non-virtual析构函数
    ...
    };
    //test.cpp
    SpecialString* pss=new SpecialString("Impending Room");
    std::string* ps;
    ...
    ps = pss;
    ...
    delete ps; //这里出现未定义错误!!!现实中*ps的SpecialString资源会泄露.
    有时我们为基类提供一个pure virtual析构函数并且提供它的一份定义,这样我们会方便很多,因
为析构函数的运作发式是,derived类析构先调用然后自动调用base部分析构函数.例如有个类Shape想
被作为基类来使用,那么可以这样定义:
    class Shape{
    public:
        virtual ~Shape() = 0;
    };
    Shape::~Shape(){}//implement
    好了,今天就到这里.
   
    请记住:
    ★ polymorphic base classes(多态基类)应该声明为一个virtual析构函数.如果class带有任何
virtual函数,它就应该拥有一个virtual析构函数.
    ★ classes的设计目的如果不是作为base classes使用,或不是为了具备多态性,就不该声明vir-
tual析构函数.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会记录下您的问题并回答。以下是代码示例: ```c++ #include <iostream> using namespace std; class BaseClass { public: // 未声明为虚析构函数 // ~BaseClass() { // cout << "BaseClass destructor called." << endl; // } virtual ~BaseClass() { cout << "BaseClass virtual destructor called." << endl; } }; class DerivedClass : public BaseClass { public: ~DerivedClass() { cout << "DerivedClass destructor called." << endl; } }; int main() { BaseClass* ptr = new DerivedClass(); delete ptr; return 0; } ``` 在这个示例中,我们定义了一个基类 `BaseClass` 和一个派生类 `DerivedClass`。在 `BaseClass` 中声明了虚析构函数和未声明为虚析构函数两种情况,并在 `main()` 中创建了一个 `DerivedClass` 对象,并将其地址赋给一个 `BaseClass` 的指针,然后通过该指针释放对象。 当 `BaseClass` 的析构函数声明为虚析构函数时,删除 `DerivedClass` 对象时只会调用 `BaseClass` 的析构函数,不会调用 `DerivedClass` 的析构函数,导致内存泄漏。这是因为 C++ 中的多态需要使用虚函数来实现,只有将 `BaseClass` 的析构函数声明为虚析构函数,才能正确地调用 `DerivedClass` 的析构函数。 当 `BaseClass` 的析构函数声明为虚析构函数时,删除 `DerivedClass` 对象时会先调用 `DerivedClass` 的析构函数,再调用 `BaseClass` 的析构函数,确保内存正确释放。 因此,正确的做法是在基类声明析构函数,并确保派生类都定义了析构函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值