10.继承和派生
2019獨角獸企業重金招聘Python工程師標準>>>
成員訪問權限:私有成員:只能被類自身的成員和友元訪問;
公有成員:可以被任何普通函數和任何類的成員函數或子類訪問;
保護成員:可以被類自身的成員和友元、派生類的成員函數訪問;
多重繼承及二義性問題
(1)使用域運算符“::” ? ?(2)使用同名覆蓋原則(3)使用虛基類
是指基類被virtual修飾,用來解決基類中由于同名成員的問題而產生的二義性問題。
虛擬繼承聲明:在派生類的聲明過程中進行
class <派生類名>: virtual <派生方式><基類名>
虛基類成員在進一步派生過程中和派生類一起維護同一個內存復制。
#include<iostream> using namespace std; class Base {protected:int x;public:Base(){x=1;} }; class Base1 : virtual public Base {public:Base1(){cout<<"Constructing Base1,x="<<x<<endl;} } class Base2 : virtual public Base {public:Base2(){cout<<"Constructing Base2,x="<<x<<endl;} } class Derived: public Base1,publice Base2 {public:Derived(){cout<<"Constructing Derived,x="<<x<<endl;} } int main() {Derived obj;return 0; }虛基類的構造函數和初始化
基類構造函數》派生(虛基類的構造函數,非虛基類構造函數)
#include<isotream> using namespace std; class Base1 {int x1;public:Base1(int y1){x1=y1;cout<<"constructing Base1, x1="<<x1<<endl;}~Base1(){cout<<"destructing Base1"<<endl;} }; class Base2 {int x2;pulice:Base2(int y2){x2=y2;cout<<"constructing Base1, x2="<<x2<<endl;}~Base2(){cout<<"destructing Base2"<<endl;} }; class Derived : public Base2,public Base1 {private:Base1 ob1;Base2 ob2;public:Derived (int x,int y,int z,int v):Base1(x),Base2(y),ob1(z),ob2(v){cout<<"constructing Derived"<<endl;} }; int main() {Derived ob(1,2,3,4);return 0; } 使用虛基類注意事項:virtual與派生方式的關鍵字的書寫位置無關緊要;一個基類在作為某些類的虛基類的同時也可作為另一些類的非虛基類;虛基類構造函數的參數必須由在新派生出來的類負責初始化,及時不是直接繼承也應如此。
:是為使類的私有成員和保護成員能夠被其他類或其他成員函數訪問。
友元函數:指友元是普通換書或類的成員函數
友元類:所有成員函數都成為友元函數
友元函數與普通成員函數不同,它不是當前類的成員函數,而是獨立于當前類的外部函數;友元函數定義后可以訪問該類的所有對象的所有成員,包括私有成員、保護成員和公有成員。
友元函數使用前必須要在類定義時聲明;其定義既可以在類內部進行,也可以在類外部進行,但通常都定義在類的外部。
/*友元函數*/ #include<iostream> using namespace std; class Rectangle {double length,width;public:Rectangle(double a=0,double b=0)//構造函數{length = a;width = b;}Rectangle(Rectangle &r);//重載構造函數friend double area(Rectangle &rectangle); }; double area(Rectangle &rectangle) { return (rectangle.length*rectangle.width); } int main() {Rectangle ob(4,5);cout<<"The area is:"<<area(ob)<<endl;return 0; } 使用友元函數注意的問題:(1)友元函數不是成員函數,因此,在類外定義友元函數時不用加”類名::“(2)友元函數不是類成員,因而不能直接引用對象成員名,必須通過作為入口參數傳遞,必須通過作為入口參數傳遞進來的對象名或對象指針來引用該對象的成員。(3)當一個函數需要訪問多個類時,應該把這個函數同時定義為這些類的友元函數,這樣才能訪問這些類的數據。
友元成員:如果一個類的成員函數時另一個類的友元函數。這種機制可使兩個類相互訪問,從而共同完成某些任務。
/*友元成員*/ #include <iostream> #include <string> using namespace std; class boy; class girl; {char *name;int age;public:girl(char *n,int a){name = new char[strlen(n)+1];strcpy(name,n);age = a;}void prt(boy &b); }; class boy {char *name;int age;public:boy(char *n,int a){name = new char[strlen(n)+1];strcpy(name,n);age = a;}friend void girl::prt(boy &b); }; void girl::prt(boy &b) {cout<<"girl\'s name:"<<name<<" age:"<<age<<"\n";cout<<"boy\'s name:"<<name<<" age:"<<age<<"\n"; } int main() {girl g1("Stacy",15);boy b1("Jim",16);g1.prt(b1);return 0; } 使用友元成員注意事項:(1)必須先定義成員函數所在的類(2)聲明友元函數時,要加上成員函數所在類的類名和作用域運算符”::“(3)在主函數中一定要創建類的一個對象,只有這樣才能通過對象名調用友元函數(4)如果在類定義前要使用到該類的成員,需要在使用前對該類進行聲明。
友元類:
當一個類成為另一類的友元類時,這個類的所有成員函數都成為另一個類的友元函數。友元類中的所有成員函數都可以通過對象名直接訪問另一個類中的所有成員,從而實現不同類之間的數據共享。
/*友元類*/ #include<iostream> #include<string> using namespace std; class boy; class girl { char *name;int age;public:girl(char *n,int a){name = new char[strlen(n)+1];strcpy(name,n);age = a;}void prt(boy &b); }; class boy {char *name;int age;friend class girl;//聲明類girl為類boy的友元類public:boy(char *n,int a){name = naw char[strlen(n)+1];strcpy(name,n);age = a;} }; void girl::prt(boy &b) {cout<<"girl \'s name:"<<name<<" age:"<<age<<"\n";cout<<"girl \'s name:"<<name<<" age"<<age<<"\n"; } int main() {girl g1("Stacy",15);boy b1("Jim",16);g1.prt(b1);return 0; }
轉載于:https://my.oschina.net/u/347414/blog/165653
總結
- 上一篇: android 设置定位服务,Andro
- 下一篇: 然爸读书笔记(2014-5)----团队