如何解决c++ [钻石配置] 如何用继承初始化?
如果我的问题很愚蠢,我深表歉意,但我是 C++ 的初学者。我正在研究钻石继承,我想知道是否可以选择特定的父类来初始化子类的属性。
感谢您的回答!
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;
}
解决方法
虚拟基类以深度优先、从左到右的顺序进行初始化。因此,您需要在继承中将 B 命名为第二个,以便 D 最后调用其构造函数,从而在最后将变量设置为 B。
class D : public C,public B
,
m_char = B::m_char;
是自赋值(只有一个 m_char
)。
在虚继承中,初始化虚类的是派生最多的类(body做赋值)。
如何在构造中显式:
#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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。