先回答大家的問題:衍生類別的預設繼承方式有兩種。用class定義派生類,預設的繼承方式是private,用struct定義派生類,預設的繼承方式為public。
推薦教學:C 影片教學
# 繼承性是物件導向程式設計的第二大特性,它允許在既有類別的基礎上建立新類,新類別可以繼承既有類別的資料成員和成員函數,可以新增自己特有的資料成員和成員函數,也可以對既有類別中的成員函數重新定義。利用類別的繼承和衍生實現了更高層次的程式碼可重用性,符合現代軟體開發的想法。
C 語言同時支援單一繼承和多重繼承。單一繼承是指派生類別只從一個基底類別繼承而來;對應的,多重繼承指派生類別同時從兩個或更多的基底類別繼承而來。 java只支援單一繼承。
一. 衍生類別
衍生類別的定義格式如下:
class <派生类名>:[继承方式]<基类名1> [,[继承方式]<基类名2>,...,[继承方式]<基类名n>] { <派生类新增的数据成员和成员函数定义> };
說明:
(1)定義派生類別關鍵字可以是class或是struct,兩者區別是:用class定義派生類,預設的繼承方式是private,用struct定義派生類,預設的繼承方式為public。新增加的成員預設屬性也是class對應private屬性,struct對應public屬性。
(2)基底類別不能被衍生類別繼承的兩類函數是建構子和析構函數。
二. 3種繼承方式下基底類別成員在衍生類別中的存取屬性
繼承描述子 | 父public成員 | 父protected成員 | 父private成員 |
public | ##子public成員子protected成員 | - | |
子protected成員 | #子protected成員 | ## - | ##子protected成員## |
private | 子private成員 | 子private成員 | - |
# 用下面的程式碼簡單理解一下:
#include "stdafx.h" #include<iostream> using namespace std; class Base { private: int priData; 9 protected: int proData; public: int pubData; }; class D1:private Base//私有继承 { void f1() { //priData=1;//基类private成员在派生类中不可直接访问 proData=2;//基类的protected成员在派生类中为private访问属性 pubData=3;//基类的public成员在派生类中为private访问属性 } }; class D2:protected Base//保护继承 { void f2() { //priData=1;//基类private成员在派生类中不可直接访问 proData=2;//基类的protected成员在派生类中为protected访问属性 pubData=3;//基类的public成员在派生类中为protected访问属性 } }; class D3:public Base//公有继承 { void f3() { //priData=1;//基类private成员在派生类中不可直接访问 proData=2;//基类的protected成员在派生类中为protected访问属性 pubData=3;//基类的public成员在派生类中为public访问属性 } }; int main() { Base obj; //obj.priData=1;//对象不可访问Base类中private成员 //obj.proData=2;//对象不可访问Base类中protected成员 obj.pubData=3; D1 objD1; //objD1.pubData=3;//private属性,不可访问 D2 objD2; //objD2.pubData=3;//protected属性,不可访问 D3 objD3; objD3.pubData=3;//public属性,可以访问 return 0; }
基底類別的private成員函數雖然在衍生類別的成員函數中不可直接訪問,但衍生類別的成員函數可以透過呼叫基底類別被繼承的函數來間接存取這些成員。如果基底類別的函數被繼承後在衍生類別中仍為public成員,則可以透過衍生類別物件直接呼叫。
先來看看類別成員的存取屬性與功能:
訪問屬性 | 作用 |
private | 只允許該類別的成員函數及友元函數訪問,不能被其他函數訪問 |
protected | 既允許該類別的成員函數及友元函數訪問,也允許其派生類別的成員函數訪問 |
#public | 既允許該類別的成員函數訪問,也允許類別外部的其他函數存取 |
好了,繼續透過程式碼來理解:
#include "stdafx.h" #include<iostream> using namespace std; class Base { private: int priData; protected: int proData; public: int pubData; //在类的定义中不能对数据成员进行初始化 void SetData()//为基类中的数据成员赋值 { priData=100; proData=200; pubData=300; } void Print() { cout<<"priData="<<priData<<endl; cout<<"proData="<<proData<<endl; cout<<"pubData="<<pubData<<endl; } }; class Derived:public Base { public: void ChangeData() { SetData(); proData=12;//在派生类的成员函数类可以访问基类的非私有成员 } }; int main() { Base b; b.SetData(); b.Print(); Derived d1; d1.ChangeData(); d1.pubData=13; d1.Print(); return 0; }
程式運行結果如下:
以上是派生類別預設的繼承方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!