You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中无需Virtual function能否实现Runtime Polymorphism(方法重写)?

无虚函数与指针的函数重写场景属于运行时多态吗?

首先明确结论:你示例中的代码不属于运行时多态,核心原因是这里的函数行为是编译时静态绑定的,而非运行时动态绑定。

关键概念区分

  • 函数隐藏(Function Hiding):你代码里dog类的print函数只是隐藏了基类animal的同名函数,而非重写(Overriding)。重写的前提是基类函数被声明为virtual,派生类函数匹配签名才能构成重写。
  • 运行时多态的核心:必须依赖动态绑定——程序运行时才根据对象的实际类型决定调用哪个函数,而非编译时根据变量的声明类型确定。

对你示例代码的分析

  • obj1是dog类型的对象,编译器在编译阶段就明确知道它的实际类型是dog,所以直接绑定dog::print,这是编译时确定的行为。
  • obj2是cat类型的对象,因为cat没有定义同名的print函数,编译器直接绑定基类animal::print,同样是编译时确定的。

只有当你使用基类指针或引用指向派生类对象,且基类函数是虚函数时,才会触发运行时多态:

#include <iostream>
using namespace std;
class animal{
public:
    virtual void print(){ // 声明为虚函数
        cout<<"I am animal"<<endl;
    }
};
class dog: public animal{
public:
    void print() override{ // 重写虚函数
        cout<<"I am dog"<<endl;
    }
};
int main()
{
    animal* ptr = new dog();
    ptr->print(); // 运行时根据对象实际类型(dog)调用对应函数,这才是运行时多态
    delete ptr;
    return 0;
}

内容的提问来源于stack exchange,提问作者Abhishek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:03:13