virtual在C++中有两个独立用途:一是声明虚函数实现运行时多态,支持动态绑定与重写;二是虚继承解决菱形继承中的重复子对象问题,由最派生类初始化虚基类。二者语义无关,不可混淆。

virtual 在 C++ 中有两个完全独立的用途:一个是用于声明 虚函数(实现运行时多态),另一个是用于 虚继承(解决多重继承中的菱形继承问题)。两者语义无关,只是共用了同一个关键字,容易混淆,需要分开理解。
虚函数:让调用在运行时决定走哪个版本
当基类中某个成员函数被声明为 virtual,就表示它支持动态绑定。派生类可以 重写(override) 这个函数,通过基类指针或引用调用时,实际执行的是对象真实类型的函数版本,而不是指针/引用静态类型的版本。
关键点:
- 虚函数必须是非静态、非构造/析构(但析构函数常需 virtual)的成员函数;
- 派生类中同名、同参数、同返回类型(协变除外)的函数会自动成为虚函数,无需再写 virtual(但建议加上以提高可读性);
- 只有通过指针或引用调用时才触发动态绑定;直接通过对象调用仍是静态绑定;
- 虚函数表(vtable)和虚函数指针(vptr)是编译器实现机制,每个含虚函数的类有 vtable,每个对象开头隐式存 vptr。
虚继承:解决“菱形继承”中的重复子对象问题
当一个类被多个间接基类共同继承(比如 D 同时继承 B 和 C,而 B 和 C 都继承自 A),若不加 virtual,D 中就会出现 两份 A 的子对象,导致二义性(如访问 A::x 不知道选哪份)、空间浪费、初始化混乱等问题。
立即学习“C++免费学习笔记(深入)”;
标签: c++
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~