Virtual应用在析构函数和构造函数调用中

1.在析构函数前面加上关键字virtual进行说明,称该析构函数为虚析构函数。例如:

class B

{

virtual ~B();

};

该类中的析构函数就是一个虚析构函数。

如果一个基类的析构函数被说明为虚析构函数,则它的派生类中的析构函数也是虚析构函数,不管它是否使用了关键字virtual进行说明。

说明虚析构函数的目的在于在使用delete运算符删除一个对象时,能保析构函数被正确地执行。因为设置虚析构函数后,可以采用动态联编方式选择析构函数。

下面举一个用虚析构函数的例子。

#include <iostream.h>

class A

{

public:

virtual ~A() { cout<<"A::~A() Called.\n"; }

};

class B : public A

{

public:

B(int i) { buf = new char[i]; }

virtual ~B()

{

delete [] buf;

cout<<"B::~B() Called.\n";

}

private:

char * buf;

};

void fun(A *a)

{

delete a;

}

void main()

{

A *a = new B(15);

fun(a);

}

执行该程序输出如下结果:

B::~B() Called.

A::~A() Called.

如果类A中的析构函数不用虚函数,则输出结果如下:

A::~A() Called.

当说明基类的析构函数是虚函数时,调用fun(a)函数,执行下述语句:

delete a;

由于执行delete语句时自动调用析构函数,采用动态联编,调用它基类的析构函数,所以输出上述结果。

当不说明基类的析构函数为虚函数时,delete隐含着对析构函数的调用,故产生A::~A() Called.的结果。

时间: 2024-12-10 16:40:06

Virtual应用在析构函数和构造函数调用中的相关文章

C++中构造函数调用构造函数

今天想做道矩阵的题目时,却卡在一些编程细节上了,找了好久才发现原来是在构造函数处出了问题,然后上网百度了下,发现这篇文章说得很好:从一道题谈C++中构造函数调用构造函数,很棒! 还补充一点: 看来自己C++的基本功还有待提高啊~~

C++多重继承构造函数调用顺序

//以典型实例说明 1 class B1{}; 2 class V1:public B1(); 3 class D1:virtual public V1(); 4 class B2{}; 5 class B3{}; 6 class V2:public B1,publicB2{}; 7 class D2:virtual public V2,public B3{}; 8 class M1{}; 9 class M2{}; 10 class X:public D1,public D2 11 { 12

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.简而言之,对象是由"底层向上"开始构造的.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反. 下面的这个程序说明这个问题 总结下来,我们必须明确的是当一个类继承与基类,并且自身还包含有其他类的成员对象的时候,构造函

Swift 2.0学习笔记(Day 42)——构造函数调用规则

原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数.向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造函数初始化父类的存储属性,这种构造函数称为指定构造函数. 构造函数调用规则 Person和Student类示例: class Person { var name: String var age: Int func description(

Virtual以及虚析构函数

Typedef int (*healthcalcfunc)(const gamecharacter&) 当一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数.因此,在子类从新声明该虚函数时,可以加,也可以不加,但习惯上每一层声明函数时都加virtual,使程序更加清晰. 友元函数 构造函数 static静态函数 不能用virtual关键字修饰: 普通成员函数 和析构函数 可以用virtual关键字修饰: virtual函数的效果 即用基类指针指向继承类对象,接着便可以用该指针使用

函数,方法,构造函数调用

1.函数调用 Function绝对是JavaScript中的重中之重.在JavaScript中,Function承担了procedures, methods, constructors甚至是classes以及modules的功能. 在面向对象程序设计中,functions,methods以及class constructor往往是三件不同的事情,由不同的语法来实现.但是在JavaScript中,这三个概念都由function来实现,通过三种不同的模式. 最简单的使用模式就是function 调用

《从零开始学Swift》学习笔记(Day 42)——构造函数调用规则

原创文章,欢迎转载.转载请注明:关东升的博客 在构造函数中可以使用构造函数代理帮助完成部分构造工作.类构造函数代理分为横向代理和向上代理,横向代理只能在发生在同一类内部,这种构造函数称为便利构造函数.向上代理发生在继承的情况下,在子类构造过程中,要先调用父类构造函数初始化父类的存储属性,这种构造函数称为指定构造函数. 构造函数调用规则 Person和Student类示例: class Person {     var name: String     var age: Int          

C#使用this关键字实现串联构造函数调用方法

本文实例讲述了C#使用this关键字实现串联构造函数调用方法.分享给大家供大家参考.具体分析如下: 在一个类中如果需要实现多个自定义构造函数,通常做法是在构造函数中实现各自的业务逻辑,如果这些业务逻辑的实现并非截然不同的话,显然不符合oop编程思想,极不利于维护,当然,我们也可以通过将相同的逻辑部分封装成一个方法,但还有一种更为合理简单的方法,下面就通过this关键字来实现串联构造函数做一简单示例. 示例代码如下: 代码如下: public class Person { public strin

构造函数调用规则

首先我们知道只要创建一个类编译器会提供三个默认函数 1.默认构造函数 (无参,空实现) 2.默认析构函数(无参,空实现) 3.默认拷贝构造函数,对值属性进行拷贝 调用规则如下 1.如果我们定义有参构造函数,编译器不会提供默认构造函数,但提供默认拷贝构造函数 2.如果用户定义了拷贝构造函数,编译器将不会提供其他构造函数 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 class person 5 { 6 public: 7 person(