C++ 多态性虚函数和动态绑定学习笔记
作者:Totn
这篇文章主要为大家介绍了C++ 多态性虚函数和动态绑定学习笔记,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
C++ 多态性
C++中的多态性通过虚函数和动态绑定来实现, 下面简单介绍一下多态的实现:
- 虚函数:在基类中声明虚函数,通过在成员函数前面加上
virtual
关键字来标识。虚函数允许子类对其进行重写(覆盖),从而实现多态。基类中的虚函数只有函数声明,没有具体的实现。 - 动态绑定:基于对象的类型来选择调用的函数,而不是基于指针或引用的类型。在编译时,编译器会根据指针或引用的静态类型进行函数调用;而在运行时,根据指针或引用所指向的对象的实际类型来决定调用哪个函数。这种在运行时确定调用的函数称为动态绑定。
- 虚函数表(vtable):编译器会为每一个包含虚函数的类生成一个虚函数表,该表存储了虚函数的地址。对象的内存布局中会包含一个指向虚函数表的指针,称为虚函数指针(vptr)。虚函数指针指向当前对象的虚函数表,通过虚函数表来找到具体的虚函数地址。
- 多态调用过程:当通过指针或引用调用虚函数时,首先会根据指针或引用的静态类型找到对应的虚函数表,然后根据虚函数表中的偏移量找到具体的虚函数地址,最终调用对应的函数。
示例代码
class Animal { public: virtual void sound() { std::cout << "动物能叫" << std::endl; } }; class Dog : public Animal { public: void sound() override { std::cout << "Dog's voice sounds like Wangwang." << std::endl; } }; class Cat : public Animal { public: void sound() override { std::cout << "Cat's voice sounds like Miaomiao." << std::endl; } }; int main() { Animal* animalPtr; Dog dog; Cat cat; animalPtr = &dog; animalPtr->sound(); // 输出: Dog's voice sounds like Wangwang. animalPtr = &cat; animalPtr->sound(); // 输出: Cat's voice sounds like Miaomiao. return 0; }
在上述示例中,Animal
类是基类,Dog
和Cat
类分别是派生类。它们都重写(覆盖)了基类的sound
函数。通过基类指针animalPtr
指向不同的派生类对象,并调用sound
函数。在运行时,根据指针所指向的对象的实际类型来选择调用哪个函数,实现了多态性。
总之,C++中的多态通过虚函数和动态绑定来实现。虚函数允许子类对其进行重写,动态绑定根据对象的实际类型来确定调用哪个函数。使用虚函数表和虚函数指针来实现动态绑定。这种机制能够提供更灵活的代码设计和对象行为的多样性。
以上就是C++ 多态性虚函数和动态绑定学习笔记的详细内容,更多关于C++ 多态虚函数动态绑定的资料请关注脚本之家其它相关文章!