c++ 使用多重继承继承特定属性

qlzsbp2j  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(113)

我被要求做一个程序,它有一个基类,两个从它派生的子类,然后另一个从两个子类派生。赋值要求我从一个子类继承一半的属性,从另一个子类继承其余的属性。(希望这对你有意义)。这些属性不是子类特有的,而是基类特有的。这是我的代码:

# 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的属性,但我想选择它从哪个类继承了哪些属性,例如从Child1继承_var1,从Child2继承_var3。这可能吗?提前感谢你:)

pcww981p

pcww981p1#

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

#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;
}

字符串
它生成same output

100
500
500


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

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


虚基类总是由最派生的类初始化。然后Child1Child2子对象通过调用它们的构造函数来初始化。它们以这个顺序被调用,因为这是struct GrandChild : Child1, Child2的顺序。
这就是为什么你在输出的最后一行看到500。首先,Base构造函数将var1转换为10。然后,Child1构造函数将100赋值。最后,Child2构造函数将500赋值。
你不能只选择性地继承一些成员。我想你想要的是让Child1100赋值给var1Child2600赋值给var2。注意,当GrandChild调用Base的构造函数时,这些成员的初始化已经发生了。因为Base是一个虚基类,而GrandChild是派生最多的类,Child1Child2在初始化GrandChild的成员var1var2时都没有任何问题。
但是,你可以编写只分配一些继承成员的构造函数:

#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;
}


Output

100
600

相关问题