通过多重继承继承特定属性

Inheriting specific attributes with multiple inheritance

提问人:Mikel 提问时间:11/17/2023 最后编辑:Mikel 更新时间:11/17/2023 访问量:35

问:

我被要求制作一个程序,该程序具有一个基类,从中派生了两个子类,然后又从两个子类派生了另一个子类。该赋值要求我从一个孩子那里继承一半的属性,从另一个孩子那里继承其余的属性。(希望这对你有意义)。 这些属性不是特定于子级的,而是特定于基类的。这是我的代码:

# include <iostream>

class Base {
    protected:
        int _var1;
        int _var2;
        int _var3;
        int _var4;

    public:

        Base() : _var1(10), _var2(20), _var3(30), _var4(40) {}
        virtual ~Base() {};

        int getVar1() const { return this->_var1; }
        int getVar2() const { return this->_var2; }
        int getVar3() const { return this->_var3; }
        int getVar4() const { return this->_var4; }
};

class Child1 : public virtual Base {
    public:
        Child1() { _var1 = 100; _var2 = 200; _var3 = 300; _var4 = 400;}
        virtual ~Child1() {}
};

class Child2 : public virtual Base {
    public:
        Child2() { _var1 = 500; _var2 = 600; _var3 = 700; _var4 = 800;}
        virtual ~Child2() {}
};

class GrandChild : public Child1, public Child2 {
    public:
        GrandChild() {}
        virtual ~GrandChild() {}
};

int main() {
    Child1      c;
    Child2      d;
    GrandChild  g;

    std::cout << c.getVar1() << std::endl;
    std::cout << d.getVar1() << std::endl;
    std::cout << g.getVar1() << std::endl;
}

使用此代码,g 实例会自动从 Child2 继承属性,但我想选择它从哪个类继承哪些属性,例如 _var1 从 Child1 继承,_var3从 Child2 继承。 这甚至可能吗? 提前非常感谢你:)

C++ 继承 菱形问题

评论

0赞 463035818_is_not_an_ai 11/17/2023
目前尚不清楚从中挑选继承成员的效果应该是什么。 是一个虚拟基础,因此只有一个子对象,无论它来自 还是 .您如何确定是否通过 或 继承?您是否正在考虑构造函数中的初始化?ChildGrandchildBaseGrandchildBaseChild1Child2_var1Child1Child2

答:

1赞 463035818_is_not_an_ai 11/17/2023 #1

我从你的代码中剥离了不相关的部分(所有的东西都是公开的,不需要再次声明虚拟析构函数):

#include <iostream>

struct Base {
    int var1;
    int var2;
    Base() : var1(10),var2(20) {}
    virtual ~Base() {};
};

struct Child1 : virtual Base {
    Child1() { var1 = 100; var2 = 200; }
};

struct Child2 : virtual Base {
    Child2() { var1 = 500; var2 = 600;}
};

struct GrandChild : Child1, Child2 {
    GrandChild() {}
};

int main() {
    Child1 c;
    Child2 d;
    GrandChild  g;
    std::cout << c.var1 << std::endl;
    std::cout << d.var1 << std::endl;
    std::cout << g.var1 << std::endl;
}

它产生相同的输出

100
500
500

这是因为,构造函数等效于:Grandchild

GrandChild() : Base(),Child1(),Child2() {}

虚拟基始终由最派生的类初始化。然后,通过调用子对象的构造函数来初始化 和 子对象。他们按这个顺序被调用,因为这就是这里的顺序。Child1Child2struct GrandChild : Child1, Child2

这就是为什么您会在输出的最后一行看到。首先,构造函数初始化为 。接下来,构造函数分配 .最终,构造函数将 .500Basevar110Child1100Child2500

不能有选择地仅继承某些成员。我想你想要的是让 assign to 和 assign to .请注意,当调用 的构造函数时,此成员的初始化已经发生。因为是一个虚拟基类,并且是派生最多的类,所以在初始化成员和 时既没有任何业务。Child1100var1Child2600var2GrandChildBaseBaseGrandChildChild1Child2var1var2GrandChild

但是,您可以编写仅分配某些继承成员的构造函数:

#include <iostream>

struct Base {
    int var1;
    int var2;
    Base() : var1(10),var2(20) {}
    virtual ~Base() {};
};

struct Child1 : virtual Base {
    Child1() { var1 = 100; }
};

struct Child2 : virtual Base {
    Child2() { var2 = 600;}
};

struct GrandChild : Child1, Child2 {
    GrandChild() : Base(),Child1(),Child2() {}
};

int main() {
    GrandChild  g;
    std::cout << g.var1 << std::endl;
    std::cout << g.var2 << std::endl;
} 

输出

100
600

评论

0赞 Mikel 11/17/2023
感谢您的回复:)这是一项学校作业,它指出“其属性和成员功能将从其任何一个父类中选择”。这就是为什么我认为我可以从每个子类中选择特定的属性值。似乎有效的是覆盖构造函数中 GrandChild 继承的值
0赞 463035818_is_not_an_ai 11/17/2023
@Mikel措辞不明确。我只能猜到他们的意思,我猜是关于:因为它是否通过 或 继承成员并不重要。如果你愿意,你可以考虑它们来自或来自,这没有区别GrandChildBaseChild1Child2Child1Child2