【问题标题】:How to avoid conflict in inheritance如何避免继承冲突
【发布时间】:2015-07-01 14:41:01
【问题描述】:

在我的 C++ 程序中,我有两个类(B1 和 B2),它们有自己的方法,但有 1 个(“意外”)是共同的。例如:

B1 类标题:

void height();
void size();
void enabled();

B2 类标题:

void width();
void length();
void enabled();

现在我有一个从 B1 和 B2 继承的 A 类。由于多重继承后我在方法enabled() 中存在“冲突”,我该如何避免这种情况?有没有办法从继承中排除方法?例如,我可以从 B1 类中排除 enabled() 继承(我不能将其设置为私有,因为它是从 B1 派生的其他类中使用的)。还有什么想法吗?

【问题讨论】:

  • 1) 不要进行多重继承 2) 不要将方法命名为相同。当存在歧义时,IIRC 编译器也会向您发出警告。
  • @m0skit0: 但假设 A 类应该实现方法 height()、size()、width() 和 length()。如何避免多重继承?此外,不同的名称(例如 B1::enabled() 和 B2::isEnabled())可能会造成混淆。
  • 您始终可以使用接口(虚拟方法)和组合而不是继承,就像 Java/C# 一样。
  • 这就是不鼓励多重继承的原因,除了多重继承/实现“接口”(完全抽象类)。你几乎可以肯定地重新考虑这个问题。一种可能性是A 应该“包装”B1B2 的实例。问问自己——A“是”B1A“是(也)”B2 真的是真的吗??

标签: c++ inheritance multiple-inheritance


【解决方案1】:

您可以解决歧义,但无论如何您都将继承这两个函数。您无法选择不继承某些功能。要解决歧义,请使用以下命令:

class B1
{
public:
    void height();
    void size();
    void enabled();
};

class B2
{
public:
    void width();
    void length();
    void enabled();
};

class A: public B1, public B2
{
public: 
    using B2::enabled;
};

【讨论】:

  • 我不知道using关键字
  • @ABCplus,在这种情况下,它会将B2::enabled“拖”到A 类,使其成为考虑使用A 对象随叫随到的唯一候选对象。在这种情况下总是使用它来解决歧义。
  • using 适用于 c++11,如果没有,可以定义 A::enabled() 并显式调用 B1::enabled()B2::enabled() 或两者。
  • @Slava,这个using 与 C++11 无关。这是一个更老的功能
  • @ixSci 嗯,你是对的,总有一些我记错了:(
【解决方案2】:

您可以尝试使用命名空间。使B1::enabled() 成为名为@9​​87654322@ 和B2::enabled() - Y 的命名空间的成员。在派生类中使用X::enabled()Y::enabled()

【讨论】:

    【解决方案3】:

    您可以使用语法Class::function 消除对基类方法的调用的歧义。在您的情况下,无论您在何处使用enabled,都需要对调用进行限定:

    B1::enabled();
    B2::enabled();
    

    如果你只需要其中一个函数,你可以写一个 using 声明:

    using B1::enabled;
    

    【讨论】:

      【解决方案4】:

      就我个人而言,我会将 B 封装在 A 中,并为它在 A 中提供的任何有用的东西提供一个接口,你需要它之​​外的东西,而不是继承。如果您需要多态行为,请让 A 和 B 都从同一个抽象接口继承。

      【讨论】:

        猜你喜欢
        • 2017-05-01
        • 2019-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 2018-02-03
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多