是否父类写了virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
参考答案:
是的,如果父类中的函数被声明为virtual
,那么子类即使不显式地使用virtual
关键字来覆盖该函数,也可以实现多态。这是因为virtual
关键字在父类中的声明已经指示了该函数可以在派生类中被覆盖。
在C++中,多态是通过虚函数(virtual
函数)和动态绑定(dynamic binding)实现的。当父类中的函数被声明为virtual
时,编译器会为这个函数创建一个虚函数表(vtable),并在运行时根据对象的实际类型来确定调用哪个版本的函数。
子类覆盖父类的virtual
函数时,即使不使用virtual
关键字,编译器仍然会将其视为虚函数,并将其添加到虚函数表中。因此,当通过父类指针或引用来调用该函数时,将实现多态,即根据对象的实际类型来调用相应的函数版本。
下面是一个简单的示例代码,演示了父类使用virtual
函数而子类不加virtual
关键字的多态实现:
#include <iostream>
class Parent {
public:
virtual void sayHello() {
std::cout << "Hello from Parent" << std::endl;
}
};
class Child : public Parent {
public:
void sayHello() override { // 使用override关键字显式指示覆盖父类的虚函数
std::cout << "Hello from Child" << std::endl;
}
};
int main() {
Parent* ptr = new Child();
ptr->sayHello(); // 输出 "Hello from Child",实现了多态
delete ptr;
return 0;
}
在上面的示例中,Parent
类中的sayHello
函数被声明为virtual
,而Child
类中的sayHello
函数覆盖了父类的函数,但没有使用virtual
关键字。然而,当通过Parent
类型的指针调用sayHello
函数时,将调用Child
类中的版本,实现了多态。