C++ 虚继承 vs 虚函数(八股总结)

简述

  • 相同之处:都利用了虚指针(均占用类的存储空间)和虚表(均不占用类的存储空间)
  • 不同之处:
    • 虚继承
      • 虚基类依旧存在继承类中,只占用存储空间
      • 虚基类表存储的是虚基类相对直接继承类的偏移
    • 虚函数
      • 虚函数不占用存储空间
      • 虚函数表存储的是虚函数地址

虚继承

定义

虚继承是一种解决 C++ 中多重继承导致的二义性问题的技术。它允许一个基类在多继承环境下只存在一个共享的副本,从而避免菱形继承(Diamond Inheritance)中出现多个基类副本的问题。

主要用途
  1. 解决菱形继承问题: 虚继承会让最终派生类共享同一个基类的实例,而不是为每条继承路径创建一个基类的实例。

    示例代码

    #include 
    using namespace std;
    
    class Base {
    public:
        int value;
    };
    
    class Derived1 : virtual public Base {};
    class Derived2 : virtual public Base {};
    
    class Final : public Derived1, public Derived2 {};
    
    int main() {
        Final obj;
        obj.value = 10; // 只有一个 Base 实例
        cout << obj.value << endl; // 输出:10
        return 0;
    }
    

    输出

    10
    
  2. 避免多重定义的二义性: 虚继承消除了访问基类成员时需要指定路径的歧义。


虚函数

定义

虚函数是通过在基类中声明为 virtual 的函数,用于实现运行时多态(动态绑定)的技术。虚函数使得派生类能够覆盖基类的方法,并确保通过基类指针或引用调用派生类的重载方法。

主要用途
  1. 实现多态行为: 虚函数允许基类指针动态调用派生类的重载函数。

    示例代码

    #include 
    using namespace std;
    
    class Base {
    public:
        virtual void show() {
            cout << "Base class" << endl;
        }
    };
    
    class Derived : public Base {
    public:
        void show() override {
            cout << "Derived class" << endl;
        }
    };
    
    int main() {
        Base* ptr = new Derived();
        ptr->show(); // 动态绑定,调用 Derived 的 show
        delete ptr;
        return 0;
    }
    

    输出

    Derived class
    
  2. 支持动态绑定: 编译器根据运行时对象的类型决定调用哪个函数,而非静态绑定的编译期决策。

你可能感兴趣的:(C++八股,c++,开发语言)