C++基类成员函数调用该类纯虚函数,该怎么理解?

qq_25368261 2017-05-26 06:17:48
class TrajectoryBuilder {
public:
TrajectoryBuilder() {}
virtual ~TrajectoryBuilder() {}

TrajectoryBuilder(const TrajectoryBuilder&) = delete;
TrajectoryBuilder& operator=(const TrajectoryBuilder&) = delete;

virtual const Submaps* submaps() const = 0;
virtual const PoseEstimate& pose_estimate() const = 0;

virtual void AddSensorData(const string& sensor_id,
std::unique_ptr<sensor::Data> data) = 0;

void AddRangefinderData(const string& sensor_id, common::Time time,
const Eigen::Vector3f& origin,
const sensor::PointCloud& ranges) {
AddSensorData(sensor_id,
common::make_unique<sensor::Data>(
time, sensor::Data::Rangefinder{origin, ranges}));
}

void AddImuData(const string& sensor_id, common::Time time,
const Eigen::Vector3d& linear_acceleration,
const Eigen::Vector3d& angular_velocity) {
AddSensorData(sensor_id, common::make_unique<sensor::Data>(
time, sensor::Data::Imu{linear_acceleration,
angular_velocity}));
}

void AddOdometerData(const string& sensor_id, common::Time time,
const transform::Rigid3d& odometer_pose) {
AddSensorData(sensor_id,
common::make_unique<sensor::Data>(time, odometer_pose));
}
};

代码如上所示,三个成员函数了都调用了该类的纯虚函数,这里怎么理解,望能提供参考。
...全文
1564 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
kakabulusi 2017-07-31
  • 打赏
  • 举报
回复
纯虚函数 虚函数 需要了解清楚。 纯虚函数,在父类中不必实现函数体,但是子类中必须对其进行实现。 虚函数,必须在父亲类中进行实现,子类中如果有实现,子类调用该函数时,则调用子类的实现方法,否则调用父类的实现方法。
Remove_ 2017-07-31
  • 打赏
  • 举报
回复
你去看看多态的解释,你就会明白,或设计模式中的简单工厂模式 你也会明白的。
codedoctor 2017-07-30
  • 打赏
  • 举报
回复
。。。你们回答的时候看一下题主的问题嘛。。 我测试了一下: class A { public: virtual void test() = 0; void test2() { test(); } }; class B :public A { public: void test() { cout << "hello" << endl; } }; void test() { B b; b.test2(); } 以上代码,输出:hello 就是由子类实现这个虚函数。然后实现多态。 A由于含有纯虚函数,所以不能实例化,不用担心虚函数被调用的问题。OK了吧
qq_36163451 2017-07-30
  • 打赏
  • 举报
回复
#include <iostream> class Base { public: virtual void show()=0; virtual void Useshow() { show(); } }; class Derver: public Base { public: void show() override { std::cout<<"Derver func"<<std::endl; } }; int main(int argc, char **argv) { Base* ptr=new Derver; ptr->Useshow(); return 0; }
pearling 2017-07-06
  • 打赏
  • 举报
回复
这就是多态的特点啊。拥有纯虚函数的类是不能用来实例化的,只有子类实现了纯虚函数才有可能被实例化。这样,如果声明一个基类的指针指向子类的实例时就可以调用到这个实现了的虚函数了。
开心秋水 2017-07-04
  • 打赏
  • 举报
回复
就是多态啊, 而且纯虚函数是可以有定义的, 比如这里的如果AddSensorData在基类中有定义, 而在派生类中没有定义, 则调用AddSensorData的函数会调用 基类的 AddSensorData函数, 即使这是个纯虚函数.
qq_25368261 2017-07-04
  • 打赏
  • 举报
回复
引用 9 楼 tuowei0484 的回复:
楼主弄明白了怎么回事吗, 我也有这个疑问。
没有解决,暂时没有看cartograher的代码了,感觉好虐心,看不懂。
qwqwqw408 2017-06-16
  • 打赏
  • 举报
回复
这个就是多态,只不过和一般明显的写法不一样而已。一般是这样写TrajectoryBuilder * p; p->AddSensorData(); 这里变成 p->AddImuData(){ this->AddSensorData(); } 这里的this指针就是p。2种都是从p指针指向的区域找虚函数表,然后调用AddSensorData对应索引的函数指针。
tuowei0484 2017-06-16
  • 打赏
  • 举报
回复
楼主弄明白了怎么回事吗, 我也有这个疑问。
qq_25368261 2017-05-31
  • 打赏
  • 举报
回复
引用 7 楼 simonhehe 的回复:

TrajectoryBuilder *p = new  TrajectoryBuilder();

p->submaps(), 调用基类方法, 返回默认值0

如果 class Test: public TrajectoryBuilder{}
Test *p = new  Test();
p->submaps(), 如果子类实现该方法则调用子类方法, 否则调用父类方法
这个多态我是知道的,但这里却没有这样用,概括为: trajectoryBuilder* p ;//没错,就是父类的指针,因为是传参的调用,也没有发现指向子类对象; p->AddRangefinderData();//接着就是调用虚函数了; trajectoryBuilder确实有子类实现了其纯虚函数addSensorData(),跟踪也确实调用了子类的addSensorData(); 如果确定是多态,而不是什么其他新用法的话(这套代码中都看到C++14的新特征),我也能确定问题的方向。
simonhehe 2017-05-31
  • 打赏
  • 举报
回复

TrajectoryBuilder *p = new  TrajectoryBuilder();

p->submaps(), 调用基类方法, 返回默认值0

如果 class Test: public TrajectoryBuilder{}
Test *p = new  Test();
p->submaps(), 如果子类实现该方法则调用子类方法, 否则调用父类方法
  • 打赏
  • 举报
回复
多态 ~
真相重于对错 2017-05-27
  • 打赏
  • 举报
回复
他的子类会实现的!
qq_25368261 2017-05-26
  • 打赏
  • 举报
回复
引用 1 楼 lianshaohua 的回复:
这种写法有什么问题吗?
addSensorData()是类的纯虚函数,在类成员函数中调用,那到底执行什么函数呢,纯虚函数在基类中没有实现的。
qq_25368261 2017-05-26
  • 打赏
  • 举报
回复
addSensorData()是类的纯虚函数,在类成员函数中调用,那到底执行什么函数呢,纯虚函数在基类中没有实现的。
ztenv 版主 2017-05-26
  • 打赏
  • 举报
回复
这种写法有什么问题吗?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧