如果一个类声明了至少一个虚函数,通常意味着这个类是为多态而设计的,它将成为一个多态类,支持运行时动态绑定和继承体系中的多态行为。
- 编译器会为多态类生成一个虚函数表(vtable),并为每个对象添加一个虚函数指针(vptr),用于支持动态绑定。
- 注意:类中声明了虚函数,其派生类并不是必须重写(override)这个虚函数。
在 C++ 中,当一个基类声明了一个虚函数,派生类可以选择性地重写它,但不是强制的。
如果派生类没有重写该虚函数,则会继承基类中该函数的实现。
如果派生类重写了该虚函数,则通过基类指针或引用调用该函数时,会根据对象的实际类型调用派生类的版本,实现多态。
示例:
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base show" << std::endl;
}
virtual void greet() {
std::cout << "Hello from Base" << std::endl;
}
};
class Derived1 : public Base {
public:
void show() override {
std::cout << "Derived1 show" << std::endl;
}
};
class Derived2 : public Base {
};
int main() {
Derived1 d1;
Derived2 d2;
Base* ptr1 = &d1;
Base* ptr2 = &d2;
ptr1->show();
ptr1->greet();
ptr2->show();
ptr2->greet();
return 0;
}
- 特殊情况:纯虚函数
如果你强制要求派生类必须重写某个函数,你应该使用 纯虚函数(pure virtual function):
class Base {
public:
virtual void mustOverride() = 0;
};
class Derived : public Base {
public:
void mustOverride() override {
std::cout << "Implemented in Derived" << std::endl;
}
};
- 包含纯虚函数的类是抽象类(abstract class),不能直接实例化。
- 派生类必须重写所有纯虚函数,否则它本身也是抽象类,无法实例化。因为继承后其虚函数还是虚函数,因此重写的时候不必再写virtual。
所以:声明了虚函数 ≠ 派生类必须重写,除非是纯虚函数。