C++基础13-类和对象之继承1
在 C++中可重用性(software reusability)是通過繼承(inheritance)這一機制來實現的。 如果沒有掌握繼承性,就沒有掌握類與對象的精華。
總結:
1、只要是父類中的private成員,不管是什么繼承方式,兒子都訪問不了,但它是存在在兒子之中的
2、如果是公有(public)繼承, 兒子中的訪問控制權限保持不變。
3、如果是保護(protected)繼承, 兒子中父親中除了private成員,其余在兒子中都是protected
4、如果是私有(private)繼承, 兒子中的父親的除了private成員,其余在二中都是private成員。
5、查看能否調用的//三看原則: ?
?? ??? ??? ??? ??? ?(1) 看調用的成員變量是在類的內部還是類的外部
?? ??? ??? ??? ??? ?(2) 看兒子繼承方式,
?? ??? ??? ??? ??? ?(3) 當前變量在兒子中的變量在父親中的訪問控制權限
6、構造方法和析構方法不繼承
5.1 類和類之間的關系
has-A,uses-A 和 is-A
has-A 包含關系,用以描述一個類由多個“部件類”構成。實現has-A關系用類成員表示,即一個類中的數據成員是另一種已經定義的類。
uses-A 一個類部分地使用另一個類。通過類之間成員函數的相互聯系,定義友員或對象參數傳遞實現。
is-A 機制稱為“繼承”。關系具有傳遞性,不具有對稱性。
5.2繼承
類的繼承,是新的類從已有類那里得到已有的特性。或從已有類產生新類 的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。
派生類的組成:
派生類中的成員,包含兩大部分,一類是從基類繼承過來的,一類是自己增加的成員。從基類繼承過過來的表現其共性,而新增的成員體現了其個性。
幾點說明:
1,全盤接收,除了構造器與析構器。基類有可能會造成派生類的成員冗余,所以說基類是需設計的。
2,派生類有了自己的個性,使派生類有了意義。
5.3、 繼承的?式
5.3.1 語法
class 派?類名:[繼承?式] 基類名 {
派?類成員聲明;
};
一個派生類可以同時有多個基類,這種情況稱為多重繼承,派生類只有一個基類, 稱為單繼承。
protected 對于外界訪問屬性來說,等同于私有,但可以派生類中可見。
public繼承:
當類的繼承方式為公有繼承時,基類的公有和保護成員的訪問屬性在派生類中不變,而基類的私有成員不可訪問。即基類的公有成員和保護成員被繼承到派生類 中仍作為派生類的公有成員和保護成員。派生類的其他成員可以直接訪問它們。無論派生類的成員還是派生類的對象都無法訪問基類的私有成員。
protected繼承:
保護繼承中,基類的公有成員和私有成員都以保護成員的身份出現在派生類 中,而基類的私有成員不可訪問。派生類的其他成員可以直接訪問從基類繼承來的 公有和保護成員,但是類外部通過派生類的對象無法訪問它們,無論派生類的成員 還是派生類的對象,都無法訪問基類的私有成員。
private繼承:
當類的繼承方式為私有繼承時,基類中的公有成員和保護成員都以私有成員身份出現在派生類中,而基類的私有成員在派生類中不可訪問。基類的公有 成員和保 護成員被繼承后作為派生類的私有成員,派生類的其他成員可以直接 訪問它們,但 是在類外部通過派生類的對象無法訪問。無論是派生類的成員還是通過派生類的對 象,都無法訪問從基類繼承的私有成員。通過多次私有繼承后,對于基類的成員都 會成為不可訪問。因此私有繼承比較少用。
private成員在子類中依然存在,但是卻無法訪問到。不論何種方式繼承基類,派生類都不能直接使用基類的私有成員 。
如何恰當使用public,protected,private繼承方式:
1、需要被外界訪問的成員直接設置為public
2、只能在當前類中訪問的成員設置為private
3、只能在當前類和子類中訪問的成員設置為protected(protected成員的訪問權限介于public和private之間。 )
1類和類之間的關系
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class A { public:void func() {cout << "funcA" << endl;}int a; };//類B擁有類A的成員變量, B has A ,//類B 依賴于 類A 依賴度高 class B { public:void funcB() {}A a; }; //耦合度 高內聚 低耦合//類C 的成員方法 需要類A的形參, C use A,//類C 依賴于 類A class C { public:void funcC(A *a) {}void funcC2(){} };//D繼承與A 類D 如果是繼承類A 類 D is A 。//類D繼承與A 耦合度很高 class D :public A { public:void funcD() {cout << this->a << endl;}};class E :public D { }; int main(void) {return 0; }2繼承的基本概念
#if 1 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string>using namespace std;class Student { public:Student(){}Student(int id, string name){this->id = id;this->name = name;}void printS() {cout << "id = " << this->id << ", name = " << this->name << endl;}int id; private:string name; };//創建一個新的學生類,增加score、功能 class Student2 { public:Student2(int id, string name, int score){this->id = id;this->name = name;this->score = score;}void printS() {cout << "id = " << this->id << ", name = " << this->name << endl;cout << "score = " << this->score << endl;} private:int id;string name;//addint score; };//通過繼承創建一個新的學生類 class Student3 :public Student { public://Student3(int id, string name, int score) //{// this->id = id;// this->name = name; //無法訪問父類的私有成員// this->score = score;//}Student3(int id, string name, int score) :Student(id, name) //利用父類的構造方法進行初始化部分數據成員{this->score = score;}void printS() {Student::printS();cout << "score = " << this->score << endl;} private:int score; };int main(void) {Student3 s3(1, "zhang3", 80);s3.printS();return 0; } #endif3繼承的方式
#if 1 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <memory>using namespace std;//規則1, 只要是父類中的private成員,不管是什么繼承方式,兒子都訪問不了 //規則2, 如果是公有(public)繼承, 兒子中的訪問控制權限保持不變。 //規則3, 如果是保護(protected)繼承, 兒子中父親中除了private成員,其余在兒子中都是protected //規則4, 如果是私有(private)繼承, 兒子中的父親的除了private成員,其余在二中都是private成員。class Parent { public:int pub; //在類的內部 和 外部 都能訪問。 protected:int pro; //在類的內部可以訪問, 在類的外部不可以訪問 private:int pri; //在類的內部可以訪問, 在類的外部不可以訪問 };//公有繼承 class Child :public Parent { public:void func(){cout << pub << endl; //pub父類的public成員變量,在public繼承 類的 【內部 外部】可以訪問。 cout << pro << endl;//pro 是父類protected成員變量 在public繼承類的 【內部】可以訪問。外部訪問不了 //此時的pro在孫子能夠訪問,說此時pro不是private成員,而是protected成員//cout << pri << endl; //pri 是父類private成員變量 在public繼承類的 【內部,外部】[不]可以訪問。}};//孫子類 class SubChild : public Child {void sub_func(){cout << pro << endl;} };//保護繼承 class Child2 :protected Parent { public:void func2() {pub;//此時pub通過protected繼承 能夠在類的內部訪問。 //pub 在類的內部可以訪問, 類的外部訪問不了, 類的兒子可以訪問//pub 就是protected成員pro;//pro 根pub 是一樣的性質,pro也是protected成員//pri;} };class Sub_child2 :public Child2 { public:void sub_func2() {pub;pro;} };//私有繼承 class Child3 :private Parent { public:void func3(){pub;//pub 在類的內部可以訪問。在類的內部可以訪問,類的外部不能訪問。//pub 在兒子中訪問不了,說明pub在Child3中是 私有成員pro;//pro 根pub的性質是一樣, 也是私有成員。//pri;} };class Sub_Child3 :public Child3 { public:void sub_fun3(){//pub;//pro;} };//三看原則: //1 看調用的成員變量是在類的內部還是類的外部 //2 看兒子繼承方式, //3 當前變量在兒子中的變量在父親中的訪問控制權限int main(void) {Child c1;c1.func();c1.pub;//c1.pri;Child2 c2;//c2.pub;//c2.pro;Child3 c3;//c3.pub;//c3.pro;c1.pub;return 0; } #endif4繼承方式的練習
#if 0 #include<iostream> using namespace std; class A { private:int a; protected:int b; public:int c;A(){a = 0;b = 0;c = 0;}void set(int a, int b, int c){this->a = a;this->b = b;this->c = c;} };class B : public A { public:void print(){//cout << "a = " << a; //a是父類的私有成員訪問不了cout << "b = " << b; //b 此時是保護成員,類的內部可以訪問cout << "c = " << c << endl; //c 此時是公有成員,類的內部可以訪問} };class C : protected A { public:void print(){//cout << "a = " << a; //a是父類的私有成員訪問不了cout << "b = " << b; //b 在子類中是protected權限,類的內部可以訪問。cout << "c = " << c << endl; //c 子類的protected成員,類的內部可以訪問。} };class D : private A { public:void print(){//cout << "a = " << a; //a是父類的私有成員訪問不了cout << "b = " << b << endl; //b 此時是private成員,類的內部可以訪問。cout << "c = " << c << endl; //c 此時是private成員,類的內部可以訪問。} };int main(void) {A aa;B bb;C cc;D dd;aa.c = 100; //c 是公有 ,類的外部可以訪問。bb.c = 100; //Bpublic 繼承與A ,保持權限不變,c 是公有, 類的外部可以訪問//cc.c = 100; //C protected 繼承與A, c 在此類中是protected成員,類的外部不能訪問。 //dd.c = 100; //D private 繼承與A, c在此類中private成員,類的外部不能訪問。aa.set(1, 2, 3); //set在父類中是公有權限,類外能訪問bb.set(10, 20, 30); //set是public繼承,在子類中是public權限,在類外能訪問//cc.set(40, 50, 60); //set是protected繼承,set在子類中是保護權限 類外不能否訪問//dd.set(70, 80, 90); //set是private繼承,set在子類中是私有權限 類外不能否訪問bb.print(); //print 是定義在B類 public成員函數,在類的外部可以訪問。cc.print(); //print 是定義在C類 public成員函數,在類的外部可以訪問。dd.print(); //print 是定義在D類 public成員函數,在類的外部可以訪問。return 0; } #endif?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的C++基础13-类和对象之继承1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matplotlib 横坐标少了一个点_
- 下一篇: s3c2440移植MQTT