子类重新定义父类中的虚函数,子类的函数可以被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;
}