这是调用基类构造函数的合法方法吗。
基类如下
class base_class
{
public:
base_class(int x, int y);
protected:
int a;
int b;
};
base_class::base_class(int x,int y)
{
a=x;
b=y;
}
派生类是以下
class derived_class: public base_class
{
public:
derived_class(int x,int y,int z);
protected:
int c;
};
derived_class:: derived_class(int x,int y,int z):base_class(x,y) /*Edited and included the scope resolution operator*/
{
c=z;
}
这种在C ++中定义派生类构造函数的方法是否合法,如果是,如何调用基类构造函数?
答案 0 :(得分:6)
假设你的意思
derived_class::derived_class(int x,int y,int z):base_class(x,y)
// |
// scope resolution operator
然后是的。它不仅仅是 合法的方式,它只是 显式调用当前对象的基础构造函数的唯一方法。
除非您这样做,否则将隐式调用默认构造函数。在您的情况下,基类没有默认构造函数,因此您将收到编译器错误。
答案 1 :(得分:3)
如果您正在调用非默认构造函数,这是初始化基类的正确(且唯一)方法 - 当然,如果您将第二个冒号添加到范围解析运算符中。
更常见的是在“初始化列表”(冒号和函数体之间的部分)中初始化所有成员,如下所示:
derived_class::derived_class(int x,int y,int z):
base_class(x, y),
c(z)
{
}
... c(z)
将int c
初始化为z
的值。
答案 2 :(得分:0)
是的,这是正确的方式,实际上是在派生类之前调用基类构造函数的唯一方法。