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

C++虚类继承问题:如何调用子类Calc方法而非基类方法

问题原因与解决方案

你遇到的是C++中的对象切片问题:当用Interface myRobot = Robot();初始化时,编译器会把Robot对象的基类部分拷贝到myRobot中,最终myRobot的实际类型是Interface而非Robot,因此调用Calc时只会执行基类的实现。

要正确触发多态调用子类的Calc方法,必须使用指针或引用指向子类对象——C++的虚函数多态依赖指针/引用的动态类型解析来生效。

修正后的实现示例

1. 使用智能指针(推荐,避免内存泄漏)

#include <memory>

// 基类定义(保留你的原实现)
class Interface
{
public:
    std::string name;

    virtual ~Interface() = default;

    virtual std::vector<std::vector<double>> Calc(std::vector<std::vector<double>> tab) {
        return std::vector<std::vector<double>>();
    }
};

// 子类修正构造函数名(原代码构造函数名与类名不一致,属于笔误)
class Robot : public virtual Interface
{
public:
    Robot() {...} // 构造函数名必须与类名一致
    std::vector<std::vector<double>> Calc(std::vector<std::vector<double>> tab) override {...some code...}
};

// 初始化并调用
std::unique_ptr<Interface> myRobot = std::make_unique<Robot>();
myRobot->Calc(...); // 此时会调用Robot的Calc方法

2. 使用引用(需保证绑定对象的生命周期)

Robot robotObj;
Interface& myRobot = robotObj;
myRobot.Calc(...); // 调用Robot的Calc方法

额外注意事项

  • 子类构造函数名必须与类名一致,你原代码中Robot类的构造函数写为IRB6400R_200_280(),这会导致编译错误,需修正为Robot()。
  • 子类重写虚函数时建议添加override关键字,编译器会帮你检查函数签名是否与基类虚函数一致,避免因签名差异导致的隐式错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:24