如何解决是否可以使用一个父类的方法来实现另一个父类的抽象方法?
我有以下课程:
class ServoPart {
private:
bool move() {
/* move implementation for a singular servo */
}
}
struct RoboPart {
virtual void doJob() =0;
virtual bool move() =0;
}
class Claw : public ServoPart,RoboPart {
private:
void doJob() {/* implementation */}
}
class Arm : RoboPart {
private:
ServoPart major,minor;
void doJob() {/* implementation */}
bool move() {/* implementation for two servos */}
}
现在,Arm
可以工作,因为它同时实现了 doJob
和 move
。 Claw
但是不起作用,因为它是一个抽象类,因为它没有实现 move (即使它有来自基类的 move
)。当我将 bool move() override;
添加到 Claw
时,我从链接器获得了一个对`vtable for Claw'的未定义引用失败。
有可能以某种方式做到这一点吗?或者我是否需要将 ServoPart#move
重命名为 ServoPart#moveStep
并从 Claw 中的函数 move
调用它?
解决方法
如何创建另一个基类“Part”,然后从它继承 ServoPart 和 RoboPart
struct Part {
virtual bool move() = 0;
};
class ServoPart : public Part{
private:
bool move() {
/* move implementation for a singular servo */
}
};
struct RoboPart : public Part{
virtual void doJob() = 0;
};
class Claw : public ServoPart,RoboPart {
private:
void doJob() {/* implementation */}
bool move() {/* implementation */}
};
class Arm : RoboPart {
private:
ServoPart major,minor;
void doJob() {/* implementation */}
bool move() {/* implementation for two servos */}
};
,
我试着摆弄了一下,以了解 using
语句是否可能有用,但它似乎没有达到您想要的效果。
一种可能的解决方案是使用中间类并手动调用您想要的实现,如下所示:
#include <iostream>
class ServoPart {
public:
virtual bool move() {
std::cout << "servopart::move" << std::endl;
return true;
}
};
struct RoboPart {
virtual void doJob() =0;
virtual bool move() =0;
};
struct ServoRoboPart: public ServoPart,RoboPart
{
virtual bool move(){ ServoPart::move(); return true; };
};
class Claw : public ServoRoboPart {
public:
void doJob() {std::cout << "claw::doJob" << std::endl;}
};
class Arm : RoboPart {
public:
void doJob() {std::cout << "arm::doJob" << std::endl;}
bool move() {std::cout << "arm::move" << std::endl; return true;}
};
int main()
{
Claw c;
Arm a;
a.move();
a.doJob();
c.move();
c.doJob();
}
要使其起作用,ServoRoboPart
必须能够看到 ServoPart::move
,因此它必须至少为 protected
。其他可见性更改是允许它在 ideone 上运行:https://ideone.com/ar5OQl
输出是
arm::move
arm::doJob
servopart::move
claw::doJob
按预期。
,这里的主要问题是所有方法都是私有的,因此不能从定义类外部调用它们,甚至不能从子类调用。
假设可以删除阻塞 private:
声明,使用来自超类的方法来实现来自另一个超类的方法没有问题只要它是可访问的,但实现必须是明确的:
class ServoPart {
protected:
bool move() {
/* move implementation for a singular servo */
}
};
class Claw : public ServoPart,RoboPart {
private:
void doJob() {/* implementation */}
bool move() {
return ServoPart::move();
}
};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。