C++ 中 virtual 的作用
文章目录
- 1. 用于虚继承
- 2. 用于抽象基类
- 3. 用于多态
C++ 的 virtual 关键字,常见有 3 种用途:虚继承、抽象基类和多态。
1. 用于虚继承
virtual 用于虚继承时,主要是为了解决菱形继承中的重复继承同名成员问题。使用形式如下
class Derived: virtual public Base {...
}
2. 用于抽象基类
用于创建抽象基类 abstract base class ,使用纯虚函数,形式如下:
class Foo {public:virtual void func() = 0;
}
3. 用于多态
用于多态时,基类的接口函数和析构函数都应该加上 virtual 关键字,并用基类指针或引用指向派生类对象。
-
接口函数加上 virtual ,则当调用接口函数时,可以调用子类的同名函数,实现多态。
现代 C++ 11 之后的代码,子类中重写基类的同名接口函数时,应该使用 override 或 final 关键字 。 -
建议给基类析构函数始终加上 virtual ,目的是进行主动防御型编程。
具体来说:在多态中,如果基类析构函数不使用 virtual,并且使用了基类指针指向派生类对象,那么在删除派生类对象时,将无法调用派生类的析构函数,可能导致内存泄漏。
因为无法控制后续使用者不使用基类指针指向派生类对象,因此最安全的做法是进行主动防御型编程,直接给基类的析构函数加上 virtual。
—————————— 本文结束 ——————————