C++派生类的构造与析构

版权声明:版权所有 如有侵权 概不追究 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;
}

析构函数不被继承,派生类需要自行声明析构函数。

先被构造的后被析构,后被构造的先被析构。

猜你喜欢

转载自blog.csdn.net/weixin_40903417/article/details/87736637