XMa*_*all 25 c++ language-lawyer
我的问题很简单.我们何时需要默认构造函数?请参考以下代码:
class Shape
{
int k;
public:
Shape(int n) : k(n) {}
~Shape() {}
};
class Rect : public Shape
{
int l;
public:
Rect(int n): l(n)
{} //error C2512: 'Shape' : no appropriate default constructor available
~Rect() {}
};
Run Code Online (Sandbox Code Playgroud)
为什么编译器不会在类Rect中隐式生成零参数默认构造函数?
据我所知,如果一个类(Rect)派生自另一个具有默认构造函数(隐式生成或显式提供)的类(Shape),则默认构造函数应由编译器生成.
Lig*_*ica 24
如果您使用参数创建自己的构造函数,则不会合成默认构造函数.既然你给Shape了自己的构造函数,那么你现在必须明确写出一个默认的Shape构造函数:
class Shape
{
int k;
public:
Shape() : k(0) {}
Shape(int n) : k(n) {}
~Shape() {}
};
Run Code Online (Sandbox Code Playgroud)
(你可以省略空的~Rect() {}定义,因为它们将被合成.)
但是,我觉得你不想在这里使用Shape的默认构造函数.有Rect构建Shape正确的基础:
class Shape
{
int area; // I've had to guess at what this member means. What is "k"?!
public:
Shape(const int area)
: area(area)
{}
};
class Rect : public Shape
{
int l;
int w;
public:
Rect(const int l, const int w)
: Shape(l*w)
, l(l)
, w(w)
{}
};
Run Code Online (Sandbox Code Playgroud)
另请注意,此示例被引用为滥用OO.考虑一下你是否真的需要继承.
Nic*_*ick 11
如果没有定义其他构造函数,则只能由编译器自动生成默认构造函数.无论任何继承.
而且你还需要通过调用来构造你的基类:
Rect( int n ) : Shape( n ), l(n)
{
}
Run Code Online (Sandbox Code Playgroud)