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

若基类函数非虚,能否通过基类指针调用派生类虚函数?

基类无虚函数时的派生类函数调用问题

原代码示例

class Base
{   
    public:
    virtual void f() 
    {
        g();
    }
    virtual void g()
    {
        cout<<"base";
    }
};

class Derived : public Base
{   
    public:
    virtual void f()
    {
        Base::f();
    } 
    virtual void g()
    {
        cout<<"derived";
    } 
};

int main()
{
    Base *pBase = new Derived;
    pBase->f();
    return 0;  
}

问题

原代码中基类与派生类的函数均被声明为虚函数,若基类函数未声明为虚函数,是否仍可通过基类指针调用派生类的虚函数?

解答

不行。C++的多态(动态绑定)机制有个核心前提:基类中对应的函数必须被声明为virtual。

如果基类的某个函数没加virtual,哪怕派生类把同名同签名的函数声明为虚函数,用基类指针调用该函数时,编译器会在编译阶段就确定调用基类的版本,不会根据指针指向的实际对象类型去调用派生类的函数。

比如修改原代码,去掉基类函数的virtual:

class Base
{   
    public:
    void f() 
    {
        g();
    }
    void g()
    {
        cout<<"base";
    }
};

class Derived : public Base
{   
    public:
    virtual void f()
    {
        Base::f();
    } 
    virtual void g()
    {
        cout<<"derived";
    } 
};

int main()
{
    Base *pBase = new Derived;
    pBase->f(); // 最终调用Base::g,输出"base"
    return 0;  
}

这里pBase指向的是Derived对象,但因为基类的f和g都不是虚函数,调用pBase->f()时,只会执行基类的f,进而调用基类的g,完全不会触发派生类的函数。

简单说:基类没把函数声明为虚,基类指针就只能调用基类的函数,碰不到派生类的同名虚函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 20:45:57