我被要求做一个程序,它有一个基类,两个从它派生的子类,然后另一个从两个子类派生。赋值要求我从一个子类继承一半的属性,从另一个子类继承其余的属性。(希望这对你有意义)。这些属性不是子类特有的,而是基类特有的。这是我的代码:
# 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。这可能吗?提前感谢你:)
1条答案
按热度按时间pcww981p1#
我从你的代码中剥离了不相关的部分(所有的东西都是公共的,不需要再次声明虚析构函数):
字符串
它生成same output:
型
这是因为,
Grandchild
构造函数等价于:型
虚基类总是由最派生的类初始化。然后
Child1
和Child2
子对象通过调用它们的构造函数来初始化。它们以这个顺序被调用,因为这是struct GrandChild : Child1, Child2
的顺序。这就是为什么你在输出的最后一行看到
500
。首先,Base
构造函数将var1
转换为10
。然后,Child1
构造函数将100
赋值。最后,Child2
构造函数将500
赋值。你不能只选择性地继承一些成员。我想你想要的是让
Child1
将100
赋值给var1
,Child2
将600
赋值给var2
。注意,当GrandChild
调用Base
的构造函数时,这些成员的初始化已经发生了。因为Base
是一个虚基类,而GrandChild
是派生最多的类,Child1
和Child2
在初始化GrandChild
的成员var1
和var2
时都没有任何问题。但是,你可以编写只分配一些继承成员的构造函数:
型
Output:
型