提问人:Mikel 提问时间:11/17/2023 最后编辑:Mikel 更新时间:11/17/2023 访问量:35
通过多重继承继承特定属性
Inheriting specific attributes with multiple inheritance
问:
我被要求制作一个程序,该程序具有一个基类,从中派生了两个子类,然后又从两个子类派生了另一个子类。该赋值要求我从一个孩子那里继承一半的属性,从另一个孩子那里继承其余的属性。(希望这对你有意义)。 这些属性不是特定于子级的,而是特定于基类的。这是我的代码:
# 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 继承。 这甚至可能吗? 提前非常感谢你:)
答:
我从你的代码中剥离了不相关的部分(所有的东西都是公开的,不需要再次声明虚拟析构函数):
#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() {}
虚拟基始终由最派生的类初始化。然后,通过调用子对象的构造函数来初始化 和 子对象。他们按这个顺序被调用,因为这就是这里的顺序。Child1
Child2
struct GrandChild : Child1, Child2
这就是为什么您会在输出的最后一行看到。首先,构造函数初始化为 。接下来,构造函数分配 .最终,构造函数将 .500
Base
var1
10
Child1
100
Child2
500
不能有选择地仅继承某些成员。我想你想要的是让 assign to 和 assign to .请注意,当调用 的构造函数时,此成员的初始化已经发生。因为是一个虚拟基类,并且是派生最多的类,所以在初始化成员和 时既没有任何业务。Child1
100
var1
Child2
600
var2
GrandChild
Base
Base
GrandChild
Child1
Child2
var1
var2
GrandChild
但是,您可以编写仅分配某些继承成员的构造函数:
#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
评论
GrandChild
Base
Child1
Child2
Child1
Child2
评论
Child
Grandchild
Base
Grandchild
Base
Child1
Child2
_var1
Child1
Child2