c++ 中规定:当派生类构造函数初始化时,必须同时对基类构造函数初始化,怎么理解?
在定义派生类的构造函数时除了对自己的成员进行初始化外,还必须负责调用基类的的构造函数使基类的数据成员得以初始化,请问这个怎么理解?classbase{public:bas...
在定义派生类的构造函数时除了对自己的成员进行初始化外,还必须负责调用基类的的构造函数使基类的数据成员得以初始化,请问这个怎么理解?
class base
{
public:
base(){};
};
class follow
{
public:
follow(){};//
};
是必须在定义follow()这个构造函数时对基类base的构造函数进行调用吗? 展开
class base
{
public:
base(){};
};
class follow
{
public:
follow(){};//
};
是必须在定义follow()这个构造函数时对基类base的构造函数进行调用吗? 展开
1个回答
展开全部
构造一个对象是从内向外构造的,也就是先构造基类,再构造派生类。因此必须在派生类构造函数执行前先执行基类构造函数。
你的那个例子因为构造函数都是最简单的无参数类型,所以无所谓,不需要额外明白的写出来,C++会默认帮你调用无参数的base()。实际上完整的写法应该是这样的:
class follow
{
public:
follow() : base() // 注意这里 .
{
}
}
只不过你不这么写C++也会默认帮你这么调用而已。
如果基类的构造函数是带参数的,那就必须明白写出来了:
class base
{
public:
base(int i){}
};
class follow
{
public:
follow(int i) : base(i) // 这里必须明确指定如何调用基类的构造函数 .
{
}
}
明白了么?
你的那个例子因为构造函数都是最简单的无参数类型,所以无所谓,不需要额外明白的写出来,C++会默认帮你调用无参数的base()。实际上完整的写法应该是这样的:
class follow
{
public:
follow() : base() // 注意这里 .
{
}
}
只不过你不这么写C++也会默认帮你这么调用而已。
如果基类的构造函数是带参数的,那就必须明白写出来了:
class base
{
public:
base(int i){}
};
class follow
{
public:
follow(int i) : base(i) // 这里必须明确指定如何调用基类的构造函数 .
{
}
}
明白了么?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询