一. 概念:
繼承是類和類之間的關係,與現實中的繼承相似,可以理解爲一個類從另一個類獲取成員變量和成員函數的過程。
繼承後的類稱爲派生類,被繼承的類稱爲基類(或父類),派生類除了擁有基類的成員,還可以定義自己的新成員。
二. 繼承權限:
(1)public 繼承:
基類:公有成員---繼承後--->派生類:公有屬性
基類:保護成員---繼承後--->派生類:保護屬性
基類:私有有成員---繼承後--->派生類:不可用
(2)protected 繼承:
基類:公有成員---繼承後--->派生類:保護屬性
基類:保護成員---繼承後--->派生類:保護屬性
基類:私有有成員---繼承後--->派生類:不可用
(3)prvate 繼承: 基類:公有成員---繼承後--->派生類:shi'y屬性
基類:保護成員---繼承後--->派生類:保護屬性
基類:私有有成員---繼承後--->派生類:不可用
三.本人寫的幾個程序:
(1).可以由以下程序結果可得出結論:
程序先打印 hello Base,再打印 hello Drrey,說明繼承是先調用基類的構造函數,再構造派生類的構造函數,而 析構函數調用順序與構造函數調用的順序相反,是先調用派生類的析構函數再調用基類的析構函數。
另外,打印了派生類所佔內存大小可知道派生類佔內存大小爲基類的數據成員和自己的數據成員大小之和。
#include<iostream>
using namespace std;
class Base
{
public:
int m_a;
void print1()
{
cout<<"hello base"<<endl;
}
};
class Drrey : public Base
{
public:
int m_b;
void print2()
{
cout<<"hello Drrey"<<endl;
}
};
int main()
{
Drrey d;
d.print2();
d.print1();
cout<<sizeof(Drrey)<<endl;
return 0;
}
(2)多繼承的構造函數與析構函數調用順序:
由程序知道其調用順序與單繼承相似,在調用某一派生類構造函數前都會先調用一次基類的構造函數,而析構函數也是先析構派生類,最後是基類調用析構函數。
#include<iostream>
#include<cstring>
using namespace std;
class animal
{
public:
int m_age;
animal(int age);
};
animal::animal(int age)
{
m_age=age;
cout<<"consetor"<<endl;
}
class Brid:public animal
{
public:
int m_high;
Brid(int a,int high);
};
Brid::Brid(int a,int high) : animal(a)
{
cout<<"111111"<<endl;
m_high=high;
}
class Fish:public animal
{
public:
int m_sudu;
Fish(int a,int sudu);
};
Fish::Fish(int a,int sudu):animal(a)
{
cout<<"22222"<<endl;
m_sudu=sudu;
}
class witBrid:public Brid,public Fish
{
private:
char *name;
public:
witBrid(int a,int b,int c,char *s);
};
witBrid::witBrid(int a,int b,int c,char *s) :Brid(a,b),Fish(a,c)
{
cout<<"3333"<<endl;
strcpy(name,s);
}
int main()
{
witBrid s1(3,100,30,"hh");
return 0;
}