重写(override)

子类重新定义父类中的虚函数,子类的函数可以被override修饰。

父类被重写的函数不能是static的,必须是virtual的(即在最原始的基类中被声明为virtual)

重写的函数必须有相同的名称,相同的参数列表。

重写根据实例的类型来调用相应的方法。

重定义(redefine)

子类重新定义父类中的非虚函数,子类的函数不可以被override修饰。

重定义的函数必须具有相同的名称,参数列表可以不同。

重定义根据指针的类型来调用相应的方法。

class A {
public:
    virtual void foo() {
        std::cout << "A::foo" << std::endl;
    }
    void bar() {
        std::cout << "A::bar" << std::endl;
    }
};

class B: public A {
public:
    void foo() override { // 重写,针对基类的虚函数
        std::cout << "B::foo" << std::endl;
    }

    void bar() { // 重定义,针对基类的同名函数,此处不能加 override 关键字
        std::cout << "B::bar" << std::endl;
    }
};

int main()
{
    B* b = new B();
    A* a = new A();
    A* t = nullptr;
    B* p = nullptr;

    t = a;
    t->foo(); // 输出 A::foo
    t->bar(); // 输出 A::bar
    t = b;
    t->foo(); // 输出 B::foo
    t->bar(); // 输出 A::bar
    p = b;
    p->A::bar(); // 输出 A::bar
    p->bar(); // 输出 B::bar

    delete a;
    delete b;
}