C++ 虚函数完全指南:概念、实例与 override 关键字
C++ 虚函数完全指南
本教程通过代码示例详解 C++ 虚函数的目的、多态机制、override 关键字用法及实际应用场景。
虚函数是预期被派生类重写的基类成员函数。声明为 virtual 后,即使通过基类指针/引用访问,也会调用最派生类的实现。
若基类成员非虚,通过基类指针调用永远执行基类版本,无论实际对象类型。例如:
class Base {
public:
void print() { /* 基类实现 */ }
};
class Derived : public Base {
public:
void print() { /* 派生实现 */ }
};
下面程序中,Base* 指向 Derived 实例,却调用基类版本:
int main() {
Derived derived1;
Base* base1 = &derived1;
base1->print(); // 调用 Base::print()
return 0;
}
为实现多态,需在基类声明 virtual:
class Base {
public:
virtual void print() { /* 基类实现 */ }
};
虚函数是 C++ 多态核心。深度内容请见 C++ 多态指南。
示例 1:虚函数基本用法
#include <iostream>
using namespace std;
class Base {
public:
virtual void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() override {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
Base* base1 = &derived1;
base1->print(); // 输出 Derived Function
return 0;
}
输出
Derived Function
因 Base::print 为虚函数,通过基类指针调用仍分发到 Derived::print。

C++ override 标识符
C++11 引入 override 关键字,强制编译器验证函数确实重写了虚基类成员,防止意外错误重写。
示例:
class Base {
public:
virtual void print() { /* 基类实现 */ }
};
class Derived : public Base {
public:
void print() override { /* 派生实现 */ }
};
类外定义时:
class Derived : public Base {
public:
void print() override; // 声明
};
void Derived::print() { /* 实现 */ }
安全使用 override
无 override 时,拼写错误或签名不匹配会静默创建新函数而非重写,导致隐蔽 bug。加上 override 后编译器直接报错。常见陷阱:
- 名称拼写错误:如
pint()而非print() - 返回类型不同:如返回
int而非void - 参数列表不匹配
- 基类函数未声明 virtual
虚函数实际应用场景
以 Animal 基类及派生 Dog、Cat 为例,每个类含 type 成员由构造函数初始化。
class Animal {
private:
string type;
public:
Animal() : type("Animal") {}
virtual string getType() const { return type; }
};
class Dog : public Animal {
private:
string type;
public:
Dog() : type("Dog") {}
string getType() const override { return type; }
};
class Cat : public Animal {
private:
string type;
public:
Cat() : type("Cat") {}
string getType() const override { return type; }
};
有了虚函数 getType(),单一辅助函数即可打印任意动物:
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
main() 中使用:
int main() {
Animal* animal1 = new Animal();
Animal* dog1 = new Dog();
Animal* cat1 = new Cat();
print(animal1);
print(dog1);
print(cat1);
delete animal1;
delete dog1;
delete cat1;
return 0;
}
输出
Animal: Animal Animal: Dog Animal: Cat
将 getType() 声明为虚函数,避免在每个派生类重复 print() 逻辑,并确保访问正确的 type。
C语言