virutal 函数在构造和析构函数中的运用

本文探讨了在C++中,为何基类应声明virtual析构函数以确保多态性,以及为什么构造函数不应声明为virtual。同时阐述了在构造和析构过程中调用virtual函数可能引发的问题,强调了这些规则的重要性。
摘要由CSDN通过智能技术生成

virtual函数(在构造函数和析构函数的运用) - kiplove - 博客园

virtual函数(在构造函数和析构函数的运用)

一、为多态基类声明virtual析构函数

base classes应该声明一个virtual析构函数,如果带有virtual函数,就应该拥有一个virtual析构函数。

如果带有多态性质的base classes不具有virtual析构函数,当derived class 对象经由base class指针被删除,则derived成分不会被删除。

如果class不企图成为一个base class时或者不是为了具备多态性,则不应该声明virtual的析构函数。virtual函数的出现必然需要携带某些信息并由vptr指针指出,从而对象的体积。

二、构造函数不应该声明成virtual

1 构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际类型,是该类本身,还是该类的一个派生类,或是更深层次的派生类。

2 虚函数的执行依赖于虚函数表。而虚函数表在构造函数中进行初始化工作,即初始化vptr,让他指向正确的虚函数表。而在构造对象期间,虚函数表还没有被初始化,将无法进行。

三、不在构造和析构过程调用virtual函数

在derived类对象的构造过程是先构造base class成分再构造derived class成分,中如果含有virtual函数,则有可能出现如下情况:

base class与derived class定义一个virtual函数,在derived class对象构造过程会生成base成分中对应的virtual函数,从而造成错误。

换句话说base class构造期间virtual函数不会下降到derived class阶层,

在析构的过程也一样,一旦derived class析构函数开始执行,对象内的derived成员成分就呈现未定义的值,再进入base class析构函数时此时对应的函数不复存在了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值