C++细节补充

构造函数不能是虚函数,析构函数可以且一般是虚函数。

C++ 中的虚函数通过虚函数表(Virtual Function Table,简称 vtable)来实现多态性(polymorphism)。虚函数表是一种数据结构,用于存储类的虚函数指针,允许在运行时动态地选择调用哪个函数。

  1. 虚函数声明时,可以有默认实现。如果没有默认实现,这种虚函数称为纯虚函数。它们用于定义接口,子类必须提供实现。

    class Drawable {
    public:
        virtual void draw() = 0; // 纯虚函数
    };
  2. 虚函数表(vtable): 对于包含虚函数的类,C++ 编译器会在该类的对象中添加一个指向虚函数表的指针,通常称为虚函数指针(vptr)。每个类都有一个唯一的虚函数表,存储了该类及其派生类的虚函数的地址。

  3. 虚函数的调用: 当通过基类指针或引用调用虚函数时,实际上会使用虚函数表来确定要调用哪个函数。 编译器会使用 vptr 来查找正确的虚函数表,并选择适当的虚函数。

  4. 虚函数的重写: 派生类可以重写基类中的虚函数,同时无需再使用 virtual 关键字。派生类的虚函数会覆盖基类的虚函数,但仍然保留在相同的虚函数表中。

    class Circle : public Shape {
    public:
        void draw() override {
            // 重写了基类的虚函数
        }
    };

最后更新于

这有帮助吗?