版权声明:版权所有 如有侵权 概不追究 https://blog.csdn.net/weixin_40903417/article/details/87736637
默认情况下,基类的构造函数不被继承,派生类需要定义自己的构造函数。但在C++11规定中可以使用using语句继承基类构造函数,不过只能初始化从基类继承的成员,语法形式为using B::B;。
若不继承基类的构造函数,派生类的构造函数需要给基类的构造函数传递参数。
单继承时构造函数的定义语法:
派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表),本类成员初始化列表
{
//其他初始化;
};
#include "stdafx.h"
using namespace std;
class B
{
public:
B(){cout<<"B's constructor is called."<<endl;}
B(int b):b(b){cout<<"B's constructor is called."<<endl;}
~B(){cout<<"B's destructor is called."<<endl;}
void print() const{cout<<b<<endl;}
private:
int b;
};
class C:public B
{
public:
C(){cout<<"C's constructor is called."<<endl;}
C(int b,int c):B(b),c(c)//B类的私有变量b不可直接访问,故用B的构造函数访问b
{
cout<<"C's constructor is called."<<endl;
}
~C(){cout<<"C's destructor is called."<<endl;}
void print() const
{
B::print();
cout<<c<<endl;
}
private:
int c;
};
int main()
{
C obj(5,6);
obj.print();
system("Pause");
return 0;
}
多继承时构造函数的定义语法:
派生类名::派生类名(参数表):
基类名1(基类1初始化参数表),
基类名2(基类2初始化参数表),
...
本类成员初始化列表
{
//其他初始化;
} ;
#include "stdafx.h"
using namespace std;
class A
{
public:
A(){cout<<"A's default constructor is called."<<endl;}
A(int a):a(a){cout<<"A's constructor is called."<<endl;}
~A(){cout<<"A's destructor is called."<<endl;}
void print() const{cout<<a<<endl;}
private:
int a;
};
class B
{
public:
B(){cout<<"B's default constructor is called."<<endl;}
B(int b):b(b){cout<<"B's constructor is called."<<endl;}
~B(){cout<<"B's destructor is called."<<endl;}
void print() const{cout<<b<<endl;}
private:
int b;
};
class derived:public B,public A//构造函数调用顺序先与继承顺序有关
{
public:
derived(){cout<<"derived's constructor is called."<<endl;}
derived(int a,int b,int c,int d):A(a),B(b),member1(c),member2(d)
{
cout<<"C's constructor is called."<<endl;
}
~derived(){cout<<"derived's destructor is called."<<endl;}
void print() const
{
A::print();
B::print();
member1.print();
member2.print();
}
private:
A member1;
B member2;//再由成员声明顺序决定
};
int main()
{
derived obj(1,2,3,4);
obj.print();
system("Pause");
return 0;
}
析构函数不被继承,派生类需要自行声明析构函数。
先被构造的后被析构,后被构造的先被析构。