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

基类间接调用的继承方法重载实现疑问

基类间接调用的继承方法重载实现疑问

嘿,你遇到的这个问题其实是C++里静态绑定和动态绑定的典型坑!你想要的效果完全可以实现,核心就是把基类的print函数声明为虚函数(virtual),咱们一步步给你拆解清楚。

你当前的代码里,基类Happy的print是普通成员函数,C++对普通成员函数默认是静态绑定——也就是编译的时候就确定了mood里调用的print是基类版本,哪怕this实际指向的是派生类Angry的对象,编译期也不会管,运行时还是会调用基类的print,这就是为什么bar.mood()输出Happy的原因。

要实现你想要的效果,只需要做两个关键修改:

  • 把基类的print函数声明为virtual,开启动态绑定
  • 派生类重写print时,推荐用override关键字(C++11及以后支持),编译器会帮你检查是否真的重写了基类的虚函数,避免拼写错误或参数不匹配的低级问题

给你贴个修改后的完整可运行代码:

#include <iostream>
using namespace std;

class Happy {
public: // 注意要把成员函数设为public,否则派生类和main无法访问
    virtual void print() { // 标记为虚函数,开启动态绑定
        std::cout << "Happy";
    }
    void mood() {
        this->print(); // 现在会根据this指向的实际对象类型调用对应print
    }
};

class Angry: public Happy {
public:
    void print() override { // 显式标记重写,更安全
        std::cout << "Angry";
    }
};

int main() {
    Happy foo;
    Angry bar;
    foo.mood(); // 输出 "Happy"
    bar.mood(); // 现在会输出 "Angry" 啦!
    return 0;
}

再给你理几个关键点:

  • 虚函数的动态绑定:当基类成员函数里调用虚函数时,程序会在运行时根据this指向的实际对象类型(而非指针/引用的静态类型)选择对应版本。这里bar.mood()执行时,this实际指向Angry对象,所以会调用Angry::print。
  • 你之前试的using Happy::print为什么没用?using只是把基类的print引入派生类作用域,方便你在派生类里直接调用基版print,但它完全没改变函数的绑定规则——只要不是虚函数,还是编译时就绑定死了。
  • 至于你提到的函数指针方案:确实能实现类似效果,但虚函数是C++面向对象多态设计的原生解决方案,代码更简洁、更符合面向对象思想,维护起来也更省心。

对了,还要注意成员函数的访问权限!你原来的代码里函数默认是private,派生类和main根本访问不到,我在修改后的代码里已经补了public,别漏了这个细节~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:08:07