考虑一个具有两个子类的超类,每个子类都有不同的用途。
class SuperClass
{
public:
// Some functions using SubClass1 and SubClass2
};
class SubClass1 : public SuperClass
{
public:
SubClass1() // Default constructor
{
// Initialize an instance of SubClass1
}
private:
// Some variables
};
class SubClass2 : public SuperClass
{
public:
SubClass2() // Default constructor
{
// Initialize an instance of SubClass2 with an instance of SubClass1
}
private:
// Some variables
};
如何在SubClass2中创建SubClass1类型的成员变量,即在SubClass2中调用SubClass 1的默认构造函数?
答案 0 :(得分:1)
你必须在SubClass2中提供转换构造函数,它接受SubClass1对象。即
SubClass2(const SubClass1& x)
{
//initialization
}
答案 1 :(得分:1)
将SubClass1
和SubClass2
视为两个不相关的类。他们有一个共同的父母这一事实并不会让你感兴趣。您只需使用任何其他对象创建实例:
class SubClass2 : public SuperClass
{
public:
SubClass2() // Default constructor
{
}
private:
SubClass1 class1_; // The correct default constructor will be called automatically
};
即使SubClass1
没有默认构造函数,您仍然可以将其初始化为公共成员对象:
class SubClass2 : public SuperClass
{
public:
SubClass2() :
class1_(...) // Initialize as any other member
{
}
private:
SubClass1 class1_; // Assume it doesn't have a default constructor
};
答案 2 :(得分:1)
与显示的代码进行比较的问题有点模棱两可,但如果您想在每个SubClass1
实例中使用类型SubClass2
的实例变量,那么您只需执行以下操作:
class SubClass2 : public SuperClass
{ public:
SubClass2 : sub1() {}
private:
SubClass1 sub1;
};
相反,如果您希望能够从现有SubClass2
实例初始化SubClass1
实例,请参阅@ravi的答案 - 您只需要一个转换构造函数。
如果这是你要追求的其他东西,那么请澄清......