首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以使用一个父类的方法来实现另一个父类的抽象方法?

是否可以使用一个父类的方法来实现另一个父类的抽象方法?
EN

Stack Overflow用户
提问于 2021-05-19 09:26:31
回答 3查看 57关注 0票数 0

我有以下课程:

代码语言:javascript
复制
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可以工作,因为它同时实现了doJobmove。但是,Claw不能工作,因为它是一个抽象类,因为它没有实现move (尽管它有来自基类的move )。当我将bool move() override;添加到Claw中时,我会从链接器获得对‘`vtable for Claw’故障的未定义引用。

有可能这样做吗?还是需要将ServoPart#move重命名为ServoPart#moveStep,并从爪中的函数move调用它?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-19 10:18:05

这里的主要问题是,您的所有方法都是私有的,因此不能从定义类之外调用它们,甚至不能从子类调用它们。

假设可以删除阻塞private:声明,那么使用超类的方法实现来自另一个超类的方法没有问题,只要它是可访问的,但实现必须是显式的:

代码语言:javascript
复制
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();
    }
};

}

票数 1
EN

Stack Overflow用户

发布于 2021-05-19 10:19:28

如何创建另一个基类“部件”&然后从它继承ServoPart和RoboPart

代码语言:javascript
复制
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 */}
};
票数 2
EN

Stack Overflow用户

发布于 2021-05-19 09:42:13

我试图稍微理解一下,using语句是否有用,但它似乎不能满足您的需要。

一个可能的解决方案是使用中间类并手动调用所需的实现,如下所示:

代码语言:javascript
复制
#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上运行。

输出是

代码语言:javascript
复制
arm::move
arm::doJob
servopart::move
claw::doJob

如我所愿。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67600480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档