c++的virtual关键字是做什么的 虚继承和虚基类【深入理解】

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

c++的virtual关键字是做什么的 虚继承和虚基类【深入理解】-第1张图片-佛山资讯网

virtual 在 C++ 中有两个完全独立的用途:一个是用于声明 虚函数(实现运行时多态),另一个是用于 虚继承(解决多重继承中的菱形继承问题)。两者语义无关,只是共用了同一个关键字,容易混淆,需要分开理解。

虚函数:让调用在运行时决定走哪个版本

当基类中某个成员函数被声明为 virtual,就表示它支持动态绑定。派生类可以 重写(override) 这个函数,通过基类指针或引用调用时,实际执行的是对象真实类型的函数版本,而不是指针/引用静态类型的版本。

关键点:

  • 虚函数必须是非静态、非构造/析构(但析构函数常需 virtual)的成员函数;
  • 派生类中同名、同参数、同返回类型(协变除外)的函数会自动成为虚函数,无需再写 virtual(但建议加上以提高可读性);
  • 只有通过指针或引用调用时才触发动态绑定;直接通过对象调用仍是静态绑定;
  • 虚函数表(vtable)和虚函数指针(vptr)是编译器实现机制,每个含虚函数的类有 vtable,每个对象开头隐式存 vptr。

虚继承:解决“菱形继承”中的重复子对象问题

当一个类被多个间接基类共同继承(比如 D 同时继承 B 和 C,而 B 和 C 都继承自 A),若不加 virtual,D 中就会出现 两份 A 的子对象,导致二义性(如访问 A::x 不知道选哪份)、空间浪费、初始化混乱等问题。

立即学习“C++免费学习笔记(深入)”;

标签: c++

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~