c++【钻石配置】如何用继承初始化?
Posted
技术标签:
【中文标题】c++【钻石配置】如何用继承初始化?【英文标题】:c++ [diamond configuration] How to initialize with inheritance? 【发布时间】:2021-07-05 10:08:30 【问题描述】:如果我的问题很愚蠢,我深表歉意,但我是 C++ 的初学者。我正在研究钻石继承,我想知道是否可以选择特定的父类来初始化子类的属性。
总结一下,我希望这段代码输出B
感谢您的回答!
PS:我正在使用 c++98
#include <iostream>
class A
protected:
char m_char;
public:
A(): m_char('A');
char getChar()return m_char;;
~A();
;
class B : virtual public A
private:
public:
B() m_char = 'B';;
~B();
;
class C : virtual public A
private:
public:
C() m_char = 'C';;
~C();
;
class D : public B, public C
private:
public:
D() m_char = B::m_char;;
~D();
;
int main(void)
D d;
std::cout << d.getChar() << std::endl;
【问题讨论】:
class D : public C, public B ;
?
【参考方案1】:
虚拟基类按深度优先、从左到右的顺序初始化。因此,您需要在继承中将 B 命名为第二个,以便 D 最后调用其构造函数,从而在最后将变量设置为 B。
class D : public C, public B
【讨论】:
"to name B second" 拟用于提议重新排序字母 :-) 是的,我注意到了。但我想知道是否有办法选择它应该继承哪个类。例如:如果我有两个属性,一个从 B 继承,另一个从 C 继承。可以这样做吗? 你的意思是如果你在B和C中声明一个同名的成员变量?这是不可能的。如果您在 B 和 C 中定义了变量foo
,那么您可以像这样访问它:d.B::foo
【参考方案2】:
m_char = B::m_char;
是自赋值(m_char
只有一个)。
在虚拟继承中,它是初始化虚拟类的最派生类(主体做赋值)。
如何在构造中显式:
#include <iostream>
class A
protected:
char m_char;
public:
A() : m_char('A')
char getChar() const return m_char;
virtual ~A()
;
class B : virtual public A
public:
B() : A('B')
;
class C : virtual public A
public:
C() : A('C')
;
class D : public B, public C
public:
D() : A('B'), B(), C()
;
int main()
D d;
std::cout << d.getChar() << std::endl;
【讨论】:
以上是关于c++【钻石配置】如何用继承初始化?的主要内容,如果未能解决你的问题,请参考以下文章
如何用spring实现定时器任务的执行(定时器执行时间可以从数据库获取)