跳到主要内容

是不是一个父类写了一个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关键字,但它仍然成功地覆盖了父类的虚函数,并实现了多态。