如果我们有一个父母班和两个孩子班。child1从父级继承,child2从child1继承。在child2类中,我们如何调用child1,而parent在child2中重载了构造函数。
class parents{
int x;
public:
parents(int a)
{
x=a;
}
};
class child1 : public parents{
int y;
pulic:
child1(int b)
{
y=b;
}
};
class child2 :public child1{
int z;
public:
child2(int c)
{
z=c;
// how we call above overloaded constructor in this overloaded cnstructor
}
};
您可以在子类的构造函数的成员初始化器列表中执行此操作。因为parent
不是的直接基地child2
。您必须为直接基类(child
)提供一个构造函数,child2
并且可以使用它的构造child1
函数,您可以初始化基类parent
。
因此,您将必须在整个层次结构的基类中传播初始化,但可以直接parent
在的成员初始化器列表中解决“非常基础”的构造函数()child2
。
尝试这个:
class parents {
int x;
public:
parents(int a)
{
x = a;
}
};
class child1: public parents {
int y;
public:
child1(int b): parents(b)
{
y = b;
}
};
class child2: public child1{
int z;
public:
child2(int c): child1(c)
{
z = c;
}
};
要么
您可以使用virutal
继承。虚拟基础是上述声明的例外。
它们总是在叶类中初始化,否则可能会为同一基数获得多个构造函数调用。因此,如果您将基础虚拟化,不仅child2
必须在中进行初始化,还必须。
此外,实际上您将被强制在任何“孙子”类中调用它,因此您不会偶然忘记它:
class parents {
int x;
public:
parents(int a)
{
x = a;
}
};
class child1: public virtual parents {
int y;
public:
child1(int b): parents(b)
{
y = b;
}
};
class child2: public virtual child1{
int z;
public:
child2(int c): child1(0), parents(1)
{
z = c;
}
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句