跳到主要内容

是否父类写了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类中的版本,实现了多态。