1. 程式人生 > >基類的建構函式和解構函式能不能被繼承

基類的建構函式和解構函式能不能被繼承

1:簡單的派生類的建構函式

#include<iostream> 
#include<string>
using namespace std;
class Student//宣告基類
{
protected:
	int num;
	string name;
	char sex;
public:
	Student(int n,string nam,char s)//定義基類(含參)建構函式
	{
		num=n;
		name=nam;
		sex=s;
	}
};
class Student1 : public Student//宣告公用派生類Student1
{
private:
	int age;
	string addr;
public:
	Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)
		                                                              //定義派生類建構函式
	{
		age=a;
		addr=ad;
	}
	void show()
	{
		cout<<"num:"<<num<<endl;
		cout<<"name:"<<name<<endl;
		cout<<"sex:"<<sex<<endl;
		cout<<"age:"<<age<<endl;
		cout<<"address"<<addr<<endl<<endl;
	}
	~Student1 (){}
};

 派生類建構函式首行的寫法

Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s)

派生類建構函式一般形式為

派生類建構函式名(總引數表):基類建構函式名(引數表)

        {派生類中新增資料成員初始化語句}

冒號“:”前面部分是派生類建構函式的主幹,他和以前介紹過的建構函式的形式相同,但它的總引數表中包括基類建構函式所需的引數和對派生類新增的資料成員初始化所需的引數。冒號“:”後面部分是要呼叫的基類建構函式及其引數。

       從上面列出的派生類Student1建構函式首行中可以看到,派生類建構函式名(Student1)後面括號內的引數表中包括引數的型別和引數名(如int n) ,而基類建構函式名後面括號內的引數表列只有引數名而不包括引數型別(如n,num,s),因為在這裡不是定義基類建構函式,而是呼叫基類建構函式,因此這些引數是實參而不是形參。它們可以是常量、全域性變數和派生類構造引數總引數表中的引數。

       從上面列出的派生類Student1建構函式中可以看到:呼叫基類建構函式Student時給出3個引數(n,nam,s),這是和定義基類建構函式時指定的引數相匹配的。派生類建構函式Student1有5個引數,其中前3個是用來傳遞給基類建構函式,後面兩個(a和ad)是用來對派生類所增加的資料成員初始化的。

2.派生類的解構函式

解構函式的作用是在物件撤銷之前,進行必要的清理工作。

在派生時,派生類是不能繼承基類的解構函式的,也需要通過派生類的解構函式去呼叫基類的解構函式。在派生類中可以根據需要定義自己的解構函式,用來地派生類中所增加的成員進行清理工作。基類的清理工作任然由基類的解構函式負責。

呼叫的順序與建構函式正好相反:先執行派生類自己的解構函式,對派生類新增加的成員進行清理,然後呼叫子物件的解構函式,對子物件進行清理,最後呼叫基類的解構函式,對基類進行清理。

                                                                                                                           摘自《C++程式設計基礎  譚浩強》