虚函数是C++中实现运行时多态的关键机制。通过在基类中声明虚函数,派生类可以选择重写这些函数,从而在运行时根据对象的实际类型调用相应的函数。以下是虚函数的基本用法:
定义虚函数
在基类中,将成员函数声明为`virtual`,以表明该函数可以在派生类中被重写。
重写虚函数
派生类中,通过在函数声明前加上`override`关键字来明确表示重写基类的虚函数。
调用虚函数
通过基类的指针或引用调用虚函数时,会根据指针或引用指向的对象的实际类型来调用相应的函数,实现运行时多态。
虚函数的声明和定义
虚函数可以在基类中声明但不定义(即函数体为空),具体功能由派生类提供。
纯虚函数
纯虚函数是一种特殊的虚函数,它在基类中没有函数体,只是定义了一个接口,强制派生类必须实现该函数。
示例代码
```cpp
include
using namespace std;
// 基类
class Animal {
public:
virtual void makeSound() {
cout << "动物发出声音" << endl;
}
};
// 派生类
class Dog : public Animal {
public:
void makeSound() override {
cout << "汪汪汪" << endl;
}
};
int main() {
Animal* animal1 = new Dog();
Animal* animal2 = new Animal();
animal1->makeSound(); // 输出: 汪汪汪
animal2->makeSound(); // 输出: 动物发出声音
delete animal1;
delete animal2;
return 0;
}
```
注意事项
虚函数只能用于类的成员函数,不能用于普通函数或全局函数。
虚函数调用会带来一定的性能开销,因为需要通过虚函数表(vtable)进行间接调用。为了优化性能,可以使用`final`关键字来限制派生或纯虚函数,或者使用CRTP(Curiously Recurring Template Pattern)等替代方案。
通过以上方法,虚函数可以帮助你编写更加灵活和可扩展的代码,实现运行时多态。