【问题标题】:Inherit from two parents with same members从具有相同成员的两个父母继承
【发布时间】:2021-10-31 01:55:09
【问题描述】:

我有三门课; A、B 和 C:

class A
{
    public:
        A() {}
    protected:
        int x = 0;
        int y = 0;
};

class B
{
    public:
        B() {}
    protected:
        int x = 1;
        int y = 1;
};

class C : public A, B
{
    public :
        C() {}
};

我希望 C 的 x 成员是来自 A 的成员,而 C 的 y 成员是来自 B 的成员。我该怎么做?因为我写了class C : public A, B,所以现在 C.x 和 C.y 都是 0。当我有多重继承并且我想从一个父级继承一些成员和从另一个父级继承一些成员时,我通常会遇到这个问题。有没有类似成员函数的选项,可以使用关键字using来选择使用哪个函数?

【问题讨论】:

  • 您可以通过A::xB::y 在此处访问所需的变量:https://ideone.com/F4oJ5h
  • @drescherjm 是否有类似于成员函数的选项,可以使用关键字using 来“选择”将使用哪个函数?
  • 你不能从一个继承一些成员而从另一个继承一些成员。您从两者继承 all 成员。 CA,因此它必须同时具有来自 AxyC 也是 B,因此它还必须同时具有来自 Bxy。你可以看到sizeof(C) == sizeof(A) + sizeof(B)(并且不应该有任何填充)。
  • 你能用纯虚方法int &GetX() = 0;int &GetY() = 0;为A和B创建一个基类(称为BaseAB)并适当地实现吗?

标签: c++ inheritance multiple-inheritance


【解决方案1】:

现在C.xC.y 都是0

实际上,C::xC::y 都是模棱两可的,不会编译。您可以使用using 从基类中显式选择和公开成员:

class C : public A, B
{
    public :
        C() {}

        using A::x;
        using B::y;
};

【讨论】:

  • 这不能解决我的问题。也许我把我的问题简化得太多了,但我实际上有四个类,就像一个钻石问题。在这种情况下,C.x 和 C.y 都为 0,并且使用的词没有造成任何影响
  • @kubo 好像是这样。随意使用更适合您实际问题的示例来编辑您的问题。编辑:好吧,现在我们在这里是一群人。也许一个新问题会更清楚。
  • 我在这里stackoverflow.com/q/69033631/14363307 发布了一个新问题。你能检查一下吗?
【解决方案2】:

我想从一个父级继承一些成员,从另一个继承一些成员。

这是你做不到的。所有成员都将被继承。 CA::xA::yB::xB::y

是否有类似于成员函数的选项,可以使用关键字using

您可以帮助编译器解决歧义(请参阅Quentin's answer),但事实是您仍然继承了所有成员。

class C : public A, B {
public :
    using A::x;
    using B::y;

    C() {
        std::cout << x << '\n';    // 0
        std::cout << y << '\n';    // 1

        // these are still here though:
        std::cout << A::x << '\n'; // 0
        std::cout << A::y << '\n'; // 0
        std::cout << B::x << '\n'; // 1
        std::cout << B::y << '\n'; // 1
    }
};

【讨论】:

    【解决方案3】:

    我想从一个父级继承一些成员

    不可能继承“某些成员”。您只能完整地继承一个基础。在示例中,C 类间接包含C::A::yC::B::y 以及两个x 成员。

    现在 C.x 和 C.y 都是 0。

    实际上,现在既没有C::x 也没有C::y,因为这些名字是模棱两可的。

    有没有类似于成员函数的选项,可以使用关键字 using

    是的,您可以使用 using 使名称 C::xC::y 明确。它将隐藏“未使用”的名称,但对象不会消失。与成员函数相同。


    你应该改变设计。例如,您可以这样做:

    struct Ax {
        int x = 0;
    };
    struct Ay {
        int y = 0;
    };
    struct A : Ax, Ay {};
    
    struct Bx {
        int x = 1;
    };
    struct By {
        int y = 1;
    };
    struct B : Bx, By {};
    
    struct C : Ax, By {};
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2011-02-07
      • 2016-02-15
      • 2010-09-23
      • 2017-07-02
      • 2022-11-29
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多