如何避免在 C++ 中显式构造初始化列表中继承的所有内容?
How do I avoid explicitly constructing everything inherited in an initializer list in C++?
当我构造一个对象 D 时,我需要在初始化列表中包含 A、B 和 C 的构造函数。有什么方法可以使我不需要初始化列表中的所有三个吗?
如果我尝试仅使用 B 的构造函数来初始化 D,我会收到错误消息,因为我没有 A 或 C 的默认构造函数。如果我为 A 和 C 添加默认构造函数,我会遇到 "i" 被重新初始化,没有任何价值。
#include <iostream>
using namespace std;
class A
{
int i;
public:
A(int ii) :
i(ii)
{}
~A() { }
int getI() { return i; }
};
class B : public virtual A
{
public:
B(int ii) :
A(ii)
{ }
~B() { }
};
class C : public virtual A
{
public:
C(int ii) :
A(ii)
{ }
~C() { }
};
class D : public B, public C
{
public:
D(int ii) :
A(ii), B(ii), C(ii)
{ }
~D() { }
};
int main()
{
D d(45);
cout << d.getI() << endl;
}
恐怕不会。使用虚拟继承,您的最派生 class 必须初始化虚拟基础。
阅读更多here。
如果将默认构造函数添加到 A
、B
和 C
,D
的实现会变得更简单一些。
#include <iostream>
using namespace std;
class A
{
int i;
public:
A() : i(0) {}
A(int ii) : i(ii) {}
~A() { }
int getI() { return i; }
};
class B : public virtual A
{
public:
B() { }
B(int ii) : A(ii) { }
~B() { }
};
class C : public virtual A
{
public:
C() { }
C(int ii) : A(ii) { }
~C() { }
};
class D : public B, public C
{
public:
// Relies on default constructors of the other classes.
D() { }
// Relies on the default constructors of B and C.
D(int ii) : A(ii) { }
~D() { }
};
int main()
{
D d1(45);
D d2;
cout << d1.getI() << endl;
cout << d2.getI() << endl;
}
如何为 A、B、C 构造函数添加默认值,即
A(int ii=0) :
当我构造一个对象 D 时,我需要在初始化列表中包含 A、B 和 C 的构造函数。有什么方法可以使我不需要初始化列表中的所有三个吗?
如果我尝试仅使用 B 的构造函数来初始化 D,我会收到错误消息,因为我没有 A 或 C 的默认构造函数。如果我为 A 和 C 添加默认构造函数,我会遇到 "i" 被重新初始化,没有任何价值。
#include <iostream>
using namespace std;
class A
{
int i;
public:
A(int ii) :
i(ii)
{}
~A() { }
int getI() { return i; }
};
class B : public virtual A
{
public:
B(int ii) :
A(ii)
{ }
~B() { }
};
class C : public virtual A
{
public:
C(int ii) :
A(ii)
{ }
~C() { }
};
class D : public B, public C
{
public:
D(int ii) :
A(ii), B(ii), C(ii)
{ }
~D() { }
};
int main()
{
D d(45);
cout << d.getI() << endl;
}
恐怕不会。使用虚拟继承,您的最派生 class 必须初始化虚拟基础。
阅读更多here。
如果将默认构造函数添加到 A
、B
和 C
,D
的实现会变得更简单一些。
#include <iostream>
using namespace std;
class A
{
int i;
public:
A() : i(0) {}
A(int ii) : i(ii) {}
~A() { }
int getI() { return i; }
};
class B : public virtual A
{
public:
B() { }
B(int ii) : A(ii) { }
~B() { }
};
class C : public virtual A
{
public:
C() { }
C(int ii) : A(ii) { }
~C() { }
};
class D : public B, public C
{
public:
// Relies on default constructors of the other classes.
D() { }
// Relies on the default constructors of B and C.
D(int ii) : A(ii) { }
~D() { }
};
int main()
{
D d1(45);
D d2;
cout << d1.getI() << endl;
cout << d2.getI() << endl;
}
如何为 A、B、C 构造函数添加默认值,即
A(int ii=0) :