只有基类的析构函数需要为虚函数

//
//  main.cpp
//  TescDtor
//
//  Created by Jiacan Li on 6/16/17.
//  Copyright © 2017 Jiacan Li. All rights reserved.
//

#include <iostream>
using namespace std;

class ClxBase1
{
public:
    ClxBase1()
    {
    }

    virtual ~ClxBase1()
    {
        cout<<"~ClxBase1"<<endl;
    }
};

class ClxBase2 : public ClxBase1
{
public:
    ClxBase2()
    {
    }

    ~ClxBase2()
    {
        cout<<"~ClxBase2"<<endl;
    }
};

class ClxDerived : public ClxBase2
{
public:
    ClxDerived()
    {

    }

    ~ClxDerived()
    {
        cout << "~ClxDerived" << endl;
    }
};

int main(int argc, const char * argv[])
{
    ClxBase1* cp = new ClxDerived();
    delete cp;
    int i = 0;
}

将一个子类的对象赋值给父类指针,当删除该指针时,如果没有将基类的指针写为虚函数,那么只会调用基类的析构函数。

测试上面的代码:

1、ClxBase1* cp = new ClxDerived(); 当删除指针时,会打印三条Log;

2、ClxBase2* cp = new ClxDerived(); 当删除指针时,会打印三条Log;

可见,只要在根类上生命虚析构函数,则删除任意子类指针的时候,都会顺序调用继承树路径上的析构函数。

时间: 2024-10-26 19:13:33

只有基类的析构函数需要为虚函数的相关文章

从为什么要将基类的析构函数定义为虚函数谈起~~

 首先,做一个最简单的实验,在电脑上运行下面的代码,将会产生运行错误,这或许会使你百思不得其解: #include <iostream> using namespace std; class Base { private: int a; public: ~Base(){cout << "Base dtor..." << endl;} }; class Derived : public Base { private: int b; public: ~D

析构函数定义为虚函数原因

析构函数定义为虚函数原因 先看下面一段程序: #include <iostream> using namespace std; class Person { public: virtual ~Person()                    //加了virtual,讲析构函数声明为虚函数 {    cout << "Person::~Person()" << endl; } }; class Student : public Person {

C++中为什么要将析构函数定义成虚函数

构造函数不可以是虚函数的,这个很显然,毕竟虚函数都对应一个虚函数表,虚函数表是存在对象内存空间的,如果构造函数是虚的,就需要一个虚函数表来调用,但是类还没实例化没有内存空间就没有虚函数表,这根本就是个死循环. 可是析构函数却要定义成虚函数,这是为什么呢,写一个非常简单的例子来理解一下: class AA { public: AA() {}; ~AA() { fun2(); }; virtual void fun1() { cout << "Base construct" &

(C++)浅谈多态基类析构函数声明为虚函数

主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 具体参考文章:http://www.cnblogs.com/AndyJee/p/4575385.html 2.C++多态性中的静态绑定和动态绑定 对象的静态类型:对象在声明是采用的类型,在

什么时候需要将析构函数定义为虚函数,如果不这么做,会存在什么问题?

这是网易游戏面我的一道题,当时想了一想,结果答错了,没在意,今天测试了一下,结果才认识到问题所在! 直接看代码: class Interface { public: virtual void fun() = 0; Interface() { cout<<"Interface::Interface()"<<endl; _data = new char[10]; } virtual ~Interface() { cout<<"Interface

为什么有时候需要把析构函数定义为虚函数

为什么有时候需要把析构函数定义为虚函数 析构函数的作用是在对象撤销之前做必要的清理现场的工作,当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后在调用基类的析构函数,但是用new运算符建立了一个派生类对象,并且把他赋给基类指针,那么当用delete运算符撤销这个指针指向的存储空间的时候,系统会只执行基类的析构函数,而不执行派生类的析构函数.

析构函数定义为虚函数

析构函数执行时先调用派生类的析构函数,其次才调用基类的析构函数.如果析构函数不是虚函数,而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用delete销毁对象时,只调用了基类的析构函数,未调用派生类的析构函数.这样会造成销毁对象不完全. #include<iostream.h> #include<stdlib.h> class CPerson { public: virtual ~CPerson(); //基类的析构函数必须声明为虚函数,否则 用delete销毁对象时会出

虚析构函数与纯虚函数

虚析构函数 通过基类的指针删除派生类对象时,通常情况只调用基类的析构函数 但是,删除一个派生类对象时,应该先调用派生类的析构函数,然后调用基类的析构函数(构造时自顶向下,析构时自底向上) 这种情况会产生内存泄漏,最终导致系统应可用内存不足而崩溃 解决办法 把基类的析构函数声明为virtual,此时派生类的析构函数即使不声明为virtual也为virtual函数 在调用基类的指针删除派生类对象时,会先调用派生类的析构函数,最后调用基类的析构函数 一般方法 如果一个类定义了虚函数,那么析构函数也应该

第八章:不要在构造和析构函数中使用虚函数

前言 本文将讲解一个新手C++程序员经常会犯的错误 - 在构造/析构函数中使用虚函数,并分析错误原因所在以及规避方法. 错误起因 首先,假设我们以一个实现交易的类为父类,然后一个实现买的类,一个实现卖的类为其子类. 这三个类的对象初始化过程中,都需要完成注册的这么一件事情 (函数).然而,各自注册的具体行为是不同的. 有些人会写出以下这样的代码: 1 class Transaction { 2 public: 3 Transaction(); // 父类构造函数 4 //...... 5 pri