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
相关产品推荐
相关产品推荐

