C++那些事--个人学习记录02(虚函数&纯虚函数%多态)

如果一个类声明了至少一个虚函数,通常意味着这个类是为多态而设计的,它将成为一个多态类,支持运行时动态绑定和继承体系中的多态行为。

  • 编译器会为多态类生成一个虚函数表(vtable),并为每个对象添加一个虚函数指针(vptr),用于支持动态绑定。
  • 注意:类中声明了虚函数,其派生类并不是必须重写(override)这个虚函数。
    在 C++ 中,当一个基类声明了一个虚函数,派生类可以选择性地重写它,但不是强制的。
    如果派生类没有重写该虚函数,则会继承基类中该函数的实现。
    如果派生类重写了该虚函数,则通过基类指针或引用调用该函数时,会根据对象的实际类型调用派生类的版本,实现多态。
    示例:
#include <iostream>

class Base {
public:
    virtual void show() {
        std::cout << "Base show" << std::endl;
    }

    virtual void greet() {
        std::cout << "Hello from Base" << std::endl;
    }
};

class Derived1 : public Base {
public:
    // 重写了 show(),但没有重写 greet()
    void show() override {
        std::cout << "Derived1 show" << std::endl;
    }
};

class Derived2 : public Base {
    // 没有重写任何虚函数,完全继承基类实现
};

int main() {
    Derived1 d1;
    Derived2 d2;

    Base* ptr1 = &d1;
    Base* ptr2 = &d2;

    ptr1->show();  // 输出: "Derived1 show"  (被重写)
    ptr1->greet(); // 输出: "Hello from Base" (未被重写,使用基类实现)

    ptr2->show();  // 输出: "Base show" (未被重写)
    ptr2->greet(); // 输出: "Hello from Base"

    return 0;
}
  • 特殊情况:纯虚函数
    如果你强制要求派生类必须重写某个函数,你应该使用 纯虚函数(pure virtual function):
class Base {
public:
    virtual void mustOverride() = 0; // 纯虚函数
};

class Derived : public Base {
public:
    void mustOverride() override { // 必须重写,否则无法实例化
        std::cout << "Implemented in Derived" << std::endl;
    }
};
  • 包含纯虚函数的类是抽象类(abstract class),不能直接实例化。
  • 派生类必须重写所有纯虚函数,否则它本身也是抽象类,无法实例化。因为继承后其虚函数还是虚函数,因此重写的时候不必再写virtual。

所以:声明了虚函数 ≠ 派生类必须重写,除非是纯虚函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值