是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态 ?
参考答案:
是的,一个父类中的虚函数(virtual function)可以被子类覆盖(override)而不需要在子类的函数声明中再次使用virtual
关键字。这是C++语言支持多态(polymorphism)的一种方式。
当你在父类中使用virtual
关键字声明一个函数时,这个函数就被标记为虚函数。这意味着在运行时,根据对象的实际类型(动态绑定),而不是根据对象的声明类型(静态绑定),来调用相应的函数实现。
子类可以覆盖父类的虚函数,即使不在子类的函数声明中使用virtual
关键字。编译器会根据函数签名(函数名和参数列表)来检查覆盖是否有效。如果子类提供了一个与父类虚函数签名相同的函数,那么子类的函数就会覆盖父类的函数,实现多态。
这里有一个简单的例子:
#include <iostream>
class Parent {
public:
virtual void foo() {
std::cout << "Parent::foo()" << std::endl;
}
};
class Child : public Parent {
public:
void foo() override { // 使用override关键字是可选的,用于检查覆盖的有效性
std::cout << "Child::foo()" << std::endl;
}
};
int main() {
Parent* ptr = new Child();
ptr->foo(); // 输出 "Child::foo()",实现了多态
delete ptr;
return 0;
}
在这个例子中,Parent
类有一个虚函数foo()
,Child
类覆盖了它。尽管Child
类的foo()
函数声明中没有使用virtual
关键字,但它仍然成功地覆盖了父类的虚函数,并实现了多态。