C++虚函数和纯虚函数
纯虚函数的概念
在 C++ 里,纯虚函数是在基类中声明但没有具体实现的虚函数,其声明结尾用= 0表示。
像这样的函数:
cpp
class Base {
public:
virtual void func() = 0; // 这是一个纯虚函数
};
编译时的核查
当一个类包含纯虚函数时,编译器会把这个类标记为抽象类。
在编译阶段,如果尝试实例化一个抽象类,比如进行Base obj;这样的操作,编译器会直接报错,阻止这一行为。
虚函数表(VTable)机制
对于包含虚函数的类,编译器会为其创建虚函数表,这个表中存储着类成员函数的地址。
纯虚函数在虚函数表中对应的是一个未定义的条目,或者说是一个占位符。
由于没有具体的函数实现,实例化对象后无法正确调用纯虚函数。
抽象类的作用
抽象类的主要用途是为派生类提供统一的接口规范,它本身并不实现具体功能。
派生类必须实现基类中的所有纯虚函数,才能成为具体类,进而被实例化。
例如:
cpp
class Derived : public Base {
public:
void func() override { /* 这里实现具体功能 */ } // 实现了纯虚函数
};
// 此时可以实例化 Derived 类
Derived d; // 没问题
编译错误示例
若尝试实例化抽象类Base,会得到类似这样的编译错误:
plaintext
error: cannot declare variable ‘obj’ to be of abstract type ‘Base’
note: because the following virtual functions are pure within ‘Base’:
note: virtual void Base::func()
总结:纯虚函数之所以不能实例化,是因为它没有具体的实现,使得包含它的类成为抽象类。而抽象类的虚函数表不完整,缺少纯虚函数的地址,所以编译器会禁止其实例化,以此保证类型系统的安全性。