目录
在C++中,加上 virtual
关键字可以实现多态,这是因为它允许函数在基类和派生类中有不同的实现,并确保在运行时正确调用派生类的方法。具体来说,这种机制称为“动态绑定”或“运行时多态”。
1. 概念
-
虚函数(Virtual Function):
当你在基类中声明一个函数为virtual
时,C++ 会为该函数在类的对象中创建一个虚函数表(vtable)。虚函数表是一个指针数组,其中每个元素指向类中虚函数的实现。每个类对象都有一个指向其虚函数表的指针(vptr)。 -
虚函数表(vtable):
虚函数表包含了指向该类中虚函数实现的指针。基类和每个派生类都有自己的虚函数表。基类中的虚函数表包含基类中虚函数的地址,派生类中的虚函数表则可能包含不同的地址,指向派生类中重写的虚函数实现。 -
动态绑定(Dynamic Binding):
当通过基类指针或引用调用虚函数时,C++ 运行时会通过虚函数表来决定实际调用哪个类的实现。这意味着,即使你使用的是基类的指针或引用,实际调用的仍然是派生类的实现,这取决于指针或引用所指向的对象的实际类型。
2. 示例
假设你有以下类结构:
class Animal {
public:
virtual void speak() {
cout << "动物在说话" << endl;
}
};
class Cat : public Animal {
public:
void speak() override {
cout << "小猫在说话" << endl;
}
};
如果你创建一个 Cat
对象并通过 Animal
指针调用 speak
方法:
Animal* animal = new Cat();
animal->speak();
虽然 animal
是 Animal
类型的指针,但因为 speak
是虚函数,程序会使用 animal
对象的 vptr,查找 Cat
的虚函数表,并调用 Cat
类中实现的 speak
方法。这会输出 小猫在说话
。
3. 总结
加上 virtual
关键字使得函数调用可以在运行时根据对象的实际类型动态决定调用哪个函数,从而实现了多态。虚函数表和虚函数指针的机制允许不同类型的对象在运行时执行正确的函数实现,这是面向对象编程中多态性的核心特性。
标签:函数,基本原理,派生类,多态,C++,基类,speak,指针 From: https://www.cnblogs.com/keye/p/18344598