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

如何调用调用类声明之后被重写的C++类成员方法?

如何让C++派生类的重写函数被正确调用?

原始代码如下:

class A
{
  public:
    A(){};
    
    void some_func(){
      std::cout << 1;
    };
};

class B
{
  A* my_A;
  public:
    B(A* a) : my_A{a} {};

    void use_A()
    {
      my_A->some_func();
    }
};

class C : public A
{
  public:
    C(){};

    void some_func()
    {
      std::cout << 2;
    }
};

int main()
{
  C new_c;
  B new_b(&new_c);
  new_b.use_A();
}

这段代码调用基类A的some_func输出1,核心原因是基类A中的some_func不是虚函数——C++只有虚函数才支持动态绑定,也就是运行时根据指针实际指向的对象类型,调用对应派生类的重写函数。

要实现输出2的需求,只需做两处修改:

  • 在基类A的some_func前添加virtual关键字,将其声明为虚函数
  • (可选但推荐)在派生类C的some_func后加上override关键字,明确标记这是对基类虚函数的重写,编译器会自动检查重写的合法性(比如函数签名是否匹配)

修改后的完整代码:

class A
{
  public:
    A(){};
    
    // 声明为虚函数,开启动态绑定
    virtual void some_func(){
      std::cout << 1;
    };
};

class B
{
  A* my_A;
  public:
    B(A* a) : my_A{a} {};

    void use_A()
    {
      my_A->some_func();
    }
};

class C : public A
{
  public:
    C(){};

    // 用override明确重写,C++11及以上版本支持
    void some_func() override
    {
      std::cout << 2;
    }
};

int main()
{
  C new_c;
  B new_b(&new_c);
  new_b.use_A(); // 现在会输出2
}

修改后,程序运行时会根据my_A实际指向的C对象,调用C类中重写的some_func,最终输出2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:16:07