C++创建派生类对象时,调用构造函数顺序

#include<iostream>usingnamespacestd;classBase{public:Base(){cout<<'A';}Base(intc){cou... #include<iostream>
using namespace std;
class Base{
public:
Base(){cout<<'A';}
Base(int c){cout<<c;}
~Base(){cout<<"基类析构";}
};
class Derived:public Base{
public:
Derived(){cout<<'B';}
Derived(int c){cout<<c;}
~Derived(){cout<<"派生类析构";}
};
int main()
{
int i = 9;
Derived d1(i);
return 0;
}
为什么先调用基类的默认构造函数,而不是自定义的构造函数?
删掉基类的默认构造函数后,编译出错,说没有默认构造函数,那在有自定义构造函数的情况下。一定需要显式的默认构造函数吗?
运行结果是

A9派生类析构基类析构
展开
 我来答
好求知
推荐于2017-09-23 · TA获得超过6515个赞
知道大有可为答主
回答量:966
采纳率:80%
帮助的人:1172万
展开全部
  1. 派生类构造函数中的某些初始化可能是基于基类的,所以规定构造在类层次的最根处开始,而在每一层,首先调用基类构造函数,然后调用成员对象构造函数。因为C++的成员变量是不会自动初始化的。

  2. 如果没有显式调用基类的构造函数,会自动调用基类的无参构造函数。而如果基类只有带参数的构造函数,则会报错。不一定要显式的无参构造函数,可以显式调用基类带参数的构造函数。

#include<iostream>
using namespace std;
class Base{
public:
    Base(int c){cout<< "基类带参构造函数" << c << endl;}
~Base(){cout<<"基类析构" << endl;}
};
class Derived:public Base{
public:
    Derived(int c):Base(c) // 显式调用基类构造函数
    {
     cout<< "派生类带参构造函数" << c << endl;
}
~Derived(){cout<<"派生类析构" << endl;}
};
int main()
{
    int i = 9;
    Derived d1(i);
    return 0;
}

输出结果:

基类带参构造函数9

派生类带参构造函数9

派生类析构

基类析构

pa偏爱qq
2015-08-22 · 超过56用户采纳过TA的回答
知道答主
回答量:90
采纳率:0%
帮助的人:81.6万
展开全部
因为class Derived: public Base 继承关系。
在子类构造时会调用父类构造函数,也可以手动指定:
Derived(int c):Base()//或
Derived(int c):Base(c)//此时可以删掉基类默认构造函数。
{cout<<c;}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式