关于C++抽象类、虚函数

今天查询了一些关于C++抽象类、虚函数的知识,下面做一下总结:

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。一旦某个函数在基类中声明为virtual,那么在所有的派生类中该函数都是virtual,而不需要再显式地声明为virtual。纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0”。例如:virtual void funtion1()=0。

### C++抽象类的虚析构函数 #### 定义与特性 在C++中,当一个包含至少一个纯虚函数时,则该成为抽象类抽象类不能直接实例化对象,仅能用于派生其他具体。为了确保多态行为下的资源正确释放,建议将抽象类的析构函数声明为虚函数。 对于抽象类而言,即使本身不提供具体的实现细节,也应当考虑为其定义虚析构函数: ```cpp class AbstractClass { public: virtual ~AbstractClass() {} // 虚析构函数 }; ``` 这样做是为了保证删除指向派生对象的基指针时能够调用正确的析构序列[^1]。 #### 使用场景及意义 假设存在如下继承结构: ```cpp #include <iostream> using namespace std; // 基抽象类) class Shape { public: virtual void draw() = 0; // 纯虚函数 virtual ~Shape(){} // 虚析构函数 }; // 派生之一 class Circle : public Shape { public: void draw() override { // 实现draw() cout << "Drawing a circle." << endl; } ~Circle(){ cout << "~Circle destructor called" << endl; } }; int main(){ Shape* shapePtr = new Circle(); delete shapePtr; // 此处会先调用Circle::destructor再调用Shape::destructor } ``` 上述代码展示了如何利用虚析构函数来安全地销毁动态分配的对象。如果`Shape`没有设置成虚析构函数,在执行`delete shapePtr`操作时只会触发`Shape::~Shape()`而不会触及实际创建出来的`Circle`部分的数据成员清理逻辑[^3]。 因此,在涉及多态性和运行期绑定的情况下,尤其是通过基指针管理派生对象生命周期的应用场合里,应该总是把基的析构函数设为虚函数以保障程序的安全性与稳定性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值