c++ - 在这种特定情况下,多重继承有那么糟糕吗?

标签 c++ class oop inheritance multiple-inheritance

目前我正在尝试理解 MI 的“邪恶”。我刚刚在 youtube 上观看了一个视频,其中一个 js 家伙反对继承。这是他的例子(我用 C++ 重写了它):

struct Robot
{ void drive(); };

struct MurderRobot : public Robot
{ void kill(); };

struct CleanerRobot : public Robot
{ void clean(); };

struct Animal
{ void poop(); };

struct Dog : public Animal
{ void bark(); };

struct Cat : public Animal
{ void meow(); };

然后他建议了一个新类(class)MurderRobotDog ,在他看来,这不能通过继承优雅地完成。当然,它不能通过单继承来完成。但我认为用 MI 做这件事没有任何问题。

我认为我们可以创建一个基类 BarkingObject ,这将有所有吠叫的东西。然后 Dog 继承自 Animal ,它有共同的 poop() 和 BarkingObject .当你需要一个杀狗机器人时,它必须从 BarkingObject 继承。和 MurderRobot .这更有意义。 MurderRobotDog不能从活的生物继承,因为那样它就会变成活的,这与机器人的定义相矛盾。当然,为此您必须使用被许多人认为是 EVIL 的多重继承。不幸的是,如果没有它,我们似乎无法有效地重用不同的不相关(你不需要 poop() 来调用 bark(),并且机器人案例证实了这个断言)功能。

你反对我的建议的理由是什么?

最佳答案

多重继承实现是解决这类问题的一种老式方法。

组合是新的方式。

您定义描述特定行为或一组行为的接口(interface):

struct Murderer
{
    virtual ~Murderer() = default;
    void kill();
};

struct Pooper
{
    virtual ~Pooper() = default;
    void poop();
};

实际的事物,例如猫、狗或机器人,会相应地继承(即实现)这些接口(interface)。您使用 dynamic_cast或类似的运行时技术,在执行适当的操作之前查询对象的接口(interface)。

关于c++ - 在这种特定情况下,多重继承有那么糟糕吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62426944/

相关文章:

c++ - 选择正确的模板成员函数的返回类型

JavaScript 字符串库——遇到一个小障碍

swift - 在不同场景中声明类变量

java - 如何知道我的手指在哪里、在哪个布局上?

.net - 数据库层设计问题

c++ - 在 C++ 中使用 Gdiplus 创建透明位图

c++ - 在多个测试中创建并保持状态

c++ - 使用同步或异步的单线程连接多个客户端?

c++ - condition_variable 获取锁速度慢

jquery - 如何删除所有具有相同类的元素