析构函数和虚析构函数

 1 #include <iostream>
 2
 3
 4 using namespace std;
 5
 6 class A
 7 {
 8 public:
 9     A() { cout << "构造A!" << endl; };
10     virtual ~A() { cout << "析构A!" << endl; };
11
12     virtual void DoSomething() { cout << "A的DoSomething!" << endl; };
13 };
14
15 class B : public A
16 {
17 public:
18     B() { cout << "构造B!" << endl; };
19     ~B() { cout << "析构B!" << endl; };
20
21     void DoSomething() { cout << "B的DoSomething!" << endl; };
22 };
23
24 int main()
25 {
26     A *Test1 = new A;
27     cout << "**************" << endl;
28     Test1->DoSomething();
29     cout << "**************" << endl;
30     delete Test1;
31     cout << "**************" << endl;
32     B *Test2 = new B;
33     cout << "**************" << endl;
34     Test2->DoSomething();
35     cout << "**************" << endl;
36     delete Test2;
37     cout << "**************" << endl;
38     A *Test3 = new B;
39     cout << "**************" << endl;
40     Test3->DoSomething();
41     cout << "**************" << endl;
42     delete Test3;
43     return 0;
44 }

运行结果:

修改代码,删除virtual

 1 #include <iostream>
 2
 3
 4 using namespace std;
 5
 6 class A
 7 {
 8 public:
 9     A() { cout << "构造A!" << endl; };
10      ~A() { cout << "析构A!" << endl; };
11
12     virtual void DoSomething() { cout << "A的DoSomething!" << endl; };
13 };
14
15 class B : public A
16 {
17 public:
18     B() { cout << "构造B!" << endl; };
19     ~B() { cout << "析构B!" << endl; };
20
21     void DoSomething() { cout << "B的DoSomething!" << endl; };
22 };
23
24 int main()
25 {
26     A *Test1 = new A;
27     cout << "**************" << endl;
28     Test1->DoSomething();
29     cout << "**************" << endl;
30     delete Test1;
31     cout << "**************" << endl;
32     B *Test2 = new B;
33     cout << "**************" << endl;
34     Test2->DoSomething();
35     cout << "**************" << endl;
36     delete Test2;
37     cout << "**************" << endl;
38     A *Test3 = new B;
39     cout << "**************" << endl;
40     Test3->DoSomething();
41     cout << "**************" << endl;
42     delete Test3;
43     return 0;
44 }

运行结果:

如果是是

B b;

结果:

时间: 2024-12-08 01:32:58

析构函数和虚析构函数的相关文章

构造函数、析构函数、虚析构函数、纯虚析构函数要点总结

1.派生类的构造函数.析构函数默认会调用基类的构造函数.析构函数. 顺序:基类构造.派生类构造:派生类析构,基类析构. 举例: 1 /****************************************************************************************************** 2 * File:Constructor&DestructorTest 3 * Introduction:测试构造函数.析构函数.虚构造函数与纯虚构造函数的一些

c++之虚析构函数

1.虚析构函数: 构造函数不能是虚函数.建立一个派生类对象时,必须从类     层次的根开始,沿着继承路径逐个调用基类的构造函数 析构函数可以是虚的.虚析构函数用于指引 delete 运算符正    确析构动态对象 2. 定义了基类虚析构函数,基类指针指向的 派生类动态对象也可以正确地用delete析构 3 设计类层次结构时,提供一个虚析构函数, 能够使派生类对象在不同状态下正确调用 析构函数 1 #include <iostream> 2 using namespace std; 3 4 c

c++ 虚析构函数[避免内存泄漏]

c++  虚析构函数: 虚析构函数(1)虚析构函数即:定义声明析构函数前加virtual 修饰, 如果将基类的析构函数声明为虚析构函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚析构函数. (2)基类指针pbase 指向用new动态创建的派生类对象child时,用“delete pbase;”删除对象分两种情况:第一,如果基类中的析构函数为虚析构函数,则会先删除派生类对象,再删除基类对象第二,如果基类中的析构函数为非虚析构函数,则只会删除基类对象,不会删除派生类对象,这样便出现了内存泄

【C++】正确使用虚析构函数

//正确使用虚析构函数 //使用虚析构函数,当delete删除一个对象时,能确保析构函数正确执行(动态) #include <iostream> using namespace std; class B { public: B() { cout<<"B"<<endl; } virtual void fun() { cout<<"B::fun()"<<endl; } virtual ~B() // ~B()

第六篇:为多态基类声明虚析构函数

前言 在很多类中,可以看到其析构函数都是声明为虚函数的. 那么,为何要将析构函数声明为虚函数?哪些情况要将析构函数声明为虚函数? 本文将为你解惑. 在使用 C++ 实现多态的时候,有一点一定要清楚:当派生类对象经由基类指针被删除,而此基类的析构函数没有被声明为虚函数的话,那么析构函数只会释放基类部分的成员而无视派生类成员. 如果不对这一点加以防范,那么很多时候,会带来内存泄露这样灾难性的后果. 问题描述 假设,有以下几个类,分别代表:钟,原子钟,水钟,腕表: 1 // 钟 2 class Tim

C++虚析构函数

在类中,构造函数用于初始化对象及相关操作,构造函数是不能声明为虚函数的,因为在执行构造函数前对象尚未完成创建,虚函数表尚不存在,此时就无法去查询虚函数表,因此也就无法得知该调用哪一个构造函数了. 析构函数则用于销毁对象时完成相应的资源释放工作,析构函数可以被声明为虚函数.我们先通过一个例子来说明析构函数声明为虚函数的必要性. 例1: #include<iostream>using namespace std; class base{public: base(); ~base();private

虚析构函数(√)、纯虚析构函数(√)、虚构造函数(X)

from:http://blog.csdn.net/fisher_jiang/article/details/2477577 一. 虚析构函数 我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数.因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数. 如: class Base{public:   Base(){}   virtual ~Base(){}};class Derived: public Base{public:   D

条款7:为多态的基类声明虚析构函数。

任何的类只要带有一个virtual函数那么就集合可以确定其应该有一个virtual析构函数. 同样的如果一个函数不含有virtual函数,那么通常意味着其不是一个基类函数,而且为一个不是基类的类声明virtual的析构函数是十分糟糕的事情,不要这样做.具体原因在下面: 1.首先,想要实现出virtual函数,对象必须要携带某些信息,.信息通过vptr来实现,这个vptr指向一个由函数指针构成的数组,即vtbl.盲目的去使用虚函数就会使得浪费资源.(一般人的经验是,只有当函数需要使用一个虚函数的时

C++中的虚析构函数、纯虚析构函数详解

C++中析构函数可以为纯虚函数吗? 众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用.那么析构函数是否可以设为纯虚呢? class CBase { public: CBase() { printf("CBase()\n"); } virtual ~CBase() = 0; // 析构函数是纯虚函数 }; 答案是可以,那么这样实现的目的是什么呢?当然是避免实例化. 但因为派生类不可能来实现基类的析构函数,所以基类析构函数虽然