標籤:int tracking use 父類繼承 賦值 同名 含義 函數調用 each
繼承
1)繼承是物件導向程式設計實現軟體重用的重要方法。程式猿能夠在已有基類的基礎上定義新的衍生類別。
2) 單繼承的衍生類別僅僅有一個基類。多繼承的衍生類別有多個基類。
3) 衍生類別對基類成員的訪問由繼承方式和成員性質決定。
4) 建立衍生類別對象時,先調用基類建構函式初始化衍生類別中的基類成員。調用解構函式的次序和調用建構函式的次序相反。
5)C++提供虛繼承機制,防止類繼承關係中成員訪問的二義性。
6) 多繼承提供了軟體重用的強大功能。也添加了程式的複雜性。
衍生類別類成員訪問層級
1、須要被外界訪問的成員直接設定為public
2、僅僅能在當前類中訪問的成員設定為private
3、僅僅能在當前類和子類中訪問的成員設定為protected。protected成員的訪問許可權介於public和private之間。
//類的繼承方式對子類對外訪問屬性影響#include <cstdlib>#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; //err cout<<"b = "<<b; cout<<"c = "<<endl; }};class C : protected A{public: void print() { //cout<<"a = "<<a; //err cout<<"b = "<<b; cout<<"c = "<<endl; }};class D : private A{public: void print() { //cout<<"a = "<<a; //err cout<<"b = "<<b<<endl; cout<<"c = "<<c<<endl; }};int main_01(int argc, char *argv[]){ A aa; B bb; C cc; D dd; aa.c = 100; //ok bb.c = 100; //ok //cc.c = 100; //err 類的外部是什麼含義 //dd.c = 100; //err aa.set(1, 2, 3); bb.set(10, 20, 30); //cc.set(40, 50, 60); //ee //dd.set(70, 80, 90); //ee bb.print(); cc.print(); dd.print(); system("pause"); return 0;}
類型相容性原則
子類對象能夠當作父類對象使用
子類對象能夠直接賦值給父類對象
子類對象能夠直接初始化父類對象
父類指標能夠直接指向子類對象
父類引用能夠直接引用子類對象
#include <cstdlib>#include <iostream>using namespace std;//子類就是特殊的父類class Parent03{protected: const char* name;public: Parent03() { name = "Parent03"; } void print() { cout<<"Name: "<<name<<endl; }};class Child03 : public Parent03{protected: int i;public: Child03(int i) { this->name = "Child2"; this->i = i; }};int main(){ Child03 child03(1000); //分別定義父類對象 父類指標 父類引用 child Parent03 parent = child03; Parent03* pp = &child03; Parent03& rp = child03; parent.print(); pp->print(); rp.print(); system("pause"); return 0;}
繼承中構造和析構
在子類物件建構時。須要調用父類建構函式對其繼承得來的成員進行初始化
在子類對象析構時。須要調用父類解構函式對其繼承得來的成員進行清理
#include <cstdlib>#include <iostream>using namespace std;class Parent04{public: Parent04(const char* s) { cout<<"Parent04()"<<" "<<s<<endl; } ~Parent04() { cout<<"~Parent04()"<<endl; }};class Child04 : public Parent04{public: Child04() : Parent04("Parameter from Child!") { cout<<"Child04()"<<endl; } ~Child04() { cout<<"~Child04()"<<endl; }};void run04(){ Child04 child;}int main_04(int argc, char *argv[]){ run04(); system("pause"); return 0;}
1、子類對象在建立時會首先調用父類的建構函式
2、父類建構函式運行結束後,運行子類的建構函式
3、當父類的建構函式有參數時,須要在子類的初始化列表中顯示調用
4、解構函式調用的先後順序與建構函式相反
繼承中的同名成員變數
1、當子類成員變數與父類成員變數同名時
2、子類依舊從父類繼承同名成員
3、在子類中通過範圍分辨符::進行同名成員區分(在衍生類別中使用基類的同名成員,顯式地使用類名限定符)
4、同名成員儲存在記憶體中的不同位置
c++繼承總結