构造函数在派生类与基类浅谈

正验证了一句话不用不知道,一用吓两跳。O(∩_∩)o 不瞎掰了。看看我最近在做实验报告的时候发现的自己不足之处。(大牛不要见笑)

Code:

#include<iostream>

using namespace std;
class A
{
public:
A(int x){}
private:
int a;
};

class B:public A
{
public:
B(){}
private:
int b;
};
int main()
{

return 0;
}

大家编译一下这个代码。是不是编译错误了。错误提示:

error C2512: 'A' : no appropriate default constructor available

说A类没有默认构造函数。

嗯的确没有,但是不是自己定义了一个构造函数了吗?当然没有默认构造函数呢?怎么会编译错误呢?奇怪。。。。。。

然后我把在B类里的这个构造函数去掉B(){}。却神奇的编译正确。

然后我在main函数里写上B b; 用类B去创建一个实例对象b。  编译下,竟然编译错误。

提示:

error C2512: 'B' : no appropriate default constructor available

顿时感到迷茫了。。。。难道C++学的如此差,虽然我继承还没怎么看,不过初略知道点的。不至于吧。

只有仔细分析了:派生类要生成,首先基类要可以成功生成。在定义对象b 是由类B定义的。创建过程是这样的。先看构造函数,编译器去调B类的默认构造函数的时候是先去完成基类的构造的。那么去寻找基类的默认构造函数。当然我自定义一个构造函数,默认的构造函数自然没有。所以只能找我自定义的构造函数。但是我的b对象并没有参数。而我在A类里的构造函数有参数无法匹配。故编译器提示编译错误,说没有找到默认构造函数在B类。(其实是在A类里没找到—这句话有待验证—希望知道详细的告知)。

于是我这样修改:

#include<iostream>

using namespace std;
class A
{
public:
A(int x){}
private:
int a;
};

class B:public A
{
public:
B(int x):A(x){}
private:
int b;
};
int main()
{

B b(5);
return 0;
}

果然编译通过运行正确。如果对刚才的话有疑问你们可以单步调试下。看看它运行的顺序。

很明显我上面那种修改的方法令人不满意,因为创建对象的时候非要传值才行。这样会显得太局限了。

我们可以这样修改:

#include<iostream>

using namespace std;
class A
{
public:
A(int x=0){}
private:
int a;
};

class B:public A
{
public:
B(){}
private:
int b;
};
int main()
{
B b;
return 0;
}

使用默认参数的构造函数。默认参数指的是当函数调用中省略了实参时自动使用的一个值。A(int x=0){} 充当无参构造函数又可以传值。这个好用。

不过这里还有一个比较好的方法那就是在A类里定义一个无参数的构造函数直接。也可以解决问题,本来就这是没有默认构造函数引起的嘛。

好了,问题原因知道了,也得到了解决,受益良多。切记:多实践,多发现问题,多分析,多解决问题,能力自然提高。

参考文献:《C++程序设计教程》







你可能感兴趣的:(构造函数)