问题描述
如果我的问题很愚蠢,我深表歉意,但我是 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;
}