我有以下课程:
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,并从爪中的函数move调用它?
发布于 2021-05-19 10:18:05
这里的主要问题是,您的所有方法都是私有的,因此不能从定义类之外调用它们,甚至不能从子类调用它们。
假设可以删除阻塞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();
}
};}
发布于 2021-05-19 10:19:28
如何创建另一个基类“部件”&然后从它继承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 */}
};发布于 2021-05-19 09:42:13
我试图稍微理解一下,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如我所愿。
https://stackoverflow.com/questions/67600480
复制相似问题