C++ 的三種訪問權限與三種繼承方式
我們知道C++中的類,有三種訪問權限(也稱作訪問控制),它們分別是public、protected、private。要理解它們其實也很容易,以下是為大家分享的C++ 的三種訪問權限與三種繼承方式,供大家參考借鑑,歡迎瀏覽!
父類:
class Person
{
public:
Person(const string& name, int age) : m_name(name), m_age(age)
{
}
void ShowInfo()
{
cout << "姓名:" << m_name << endl;
cout << "年齡:" << m_age << endl;
}
protected:
string m_name; //姓名
private:
int m_age; //年齡
};
class Person
{
public:
Person(const string& name, int age) : m_name(name), m_age(age)
{
}
void ShowInfo()
{
cout << "姓名:" << m_name << endl;
cout << "年齡:" << m_age << endl;
}
protected:
string m_name; //姓名
private:
int m_age; //年齡
};
子類:
class teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
調用方法:
void test()
{
Person person("張三", 22);
Info(); //public屬性,對外部可見
cout << person.m_name << endl; //protected屬性,對外部不可見
cout << person.m_age << endl; //private屬性,對外部不可見
}
void test()
{
Person person("張三", 22);
Info(); //public屬性,對外部可見
cout << person.m_name << endl; //protected屬性,對外部不可見
cout << person.m_age << endl; //private屬性,對外部不可見
}
總結
我們對C++類三種方式控制權限總結如下,這與Java中的三種對應的訪問權限是一樣的。
qq%e6%88%aa%e5%9b%be20161104113813
三種繼承方式
C++中繼承的方式還有多種,也分別都用public、protected、private表示。這與Java不一樣,Java只有繼承的概念,默認是public繼承的。
1. 三種繼承方式不影響子類對父類的訪問權限,子類對父類只看父類的訪問控制權。
如下面三種繼承方式都能訪問父類中的public和protected成員。
class Teacher : /*public*/ /*protected*/ private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
//cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
class Teacher : /*public*/ /*protected*/ private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "姓名:" << m_name << endl; //正確,protected屬性子類可見
//cout << "年齡:" << m_age << endl; //錯誤,private屬性子類不可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的`所有成員
}
private:
string m_title; //職稱
};
2. 繼承方式是為了控制子類(也稱派生類)的調用方(也叫用户)對父類(也稱基類)的訪問權限。
public繼承
class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
class Teacher : public Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
void TestPublic()
{
Teacher teacher("李四", 35, "副教授");
Info();
cout << endl;
TeacherInfo();
}
void TestPublic()
{
Teacher teacher("李四", 35, "副教授");
Info();
cout << endl;
TeacherInfo();
}
結果:
姓名:李四
年齡:35
姓名:李四
年齡:35
職稱:副教授
private繼承:
class Teacher : private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
class Teacher : private Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
void TestPrivate()
{
Teacher teacher("李四", 35, "副教授");
Info(); //錯誤,因為Teacher採用了private的繼承方式,外部不可訪問。
cout << endl;
TeacherInfo();
}
void TestPrivate()
{
Teacher teacher("李四", 35, "副教授");
Info(); //錯誤,因為Teacher採用了private的繼承方式,外部不可訪問。
cout << endl;
TeacherInfo();
}
3. public、protected、private三種繼承方式,相當於把父類的public訪問權限在子類中變成了對應的權限。
如protected繼承,把父類中的public成員在本類中變成了protected的訪問控制權限;private繼承,把父類的public成員和protected成員在本類中變成了private訪問控制權。
protected繼承:
class Teacher : protected Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
class Teacher : protected Person
{
public:
Teacher(const string& name, int age, const string& title)
: Person(name, age), m_title(title)
{
}
void ShowTeacherInfo()
{
ShowInfo(); //正確,public屬性子類可見
cout << "職稱:" << m_title << endl; //正確,本類中可見自己的所有成員
}
private:
string m_title; //職稱
};
void TestProtected()
{
Teacher teacher("李四", 35, "副教授");
Info(); //錯誤,基類Person的ShowInfo此時對Teacher相當於protected的,外部不可以被訪問
cout << endl;
TeacherInfo();
}
void TestProtected()
{
Teacher teacher("李四", 35, "副教授");
Info(); //錯誤,基類Person的ShowInfo此時對Teacher相當於protected的,外部不可以被訪問
cout << endl;
TeacherInfo();
}
class Leader : public Teacher
{
public:
Leader(const string& name, int age, const string& title, string position)
: Teacher(name, age, title), m_position(position)
{
}
void ShowLeaderInfo()
{
ShowInfo(); //基類Person的ShowInfo此時相當於protected的,但子類仍可以訪問
ShowTeacherInfo(); //ShowTeacherInfo仍然是public的,可以訪問
cout << m_position << endl;
}
private:
string m_position;
};
class Leader : public Teacher
{
public:
Leader(const string& name, int age, const string& title, string position)
: Teacher(name, age, title), m_position(position)
{
}
void ShowLeaderInfo()
{
ShowInfo(); //基類Person的ShowInfo此時相當於protected的,但子類仍可以訪問
ShowTeacherInfo(); //ShowTeacherInfo仍然是public的,可以訪問
cout << m_position << endl;
}
private:
string m_position;
};
-
2017年3月計算機二級C語言考試摸底測試題
以下是yjbys考試網小編整理的2017年3月計算機二級C語言考試摸底測試題,希望對大家有所幫助,祝大家計算機二級考試順利通過。一、選擇題(每小題1分。)(1)程序流程圖中帶有箭頭的線段表示的是()。A.圖元關係B.數據流C.控制流D.調用關係(2)結構化程序設計的基本原則...
-
C語言if else語句彙總
對於很多情況,順序結構的代碼是遠遠不夠的,大家都接觸過C語言吧,下面是小編為大家整理的C語言ifelse語句,希望對大家有所幫助。C語言ifelse語句在C語言中,使用if和else關鍵字對條件進行判斷。請先看下面的代碼:#includeintmain(){intage;printf("請輸入你的年齡:");sc...
-
C語言精選面試題詳解
C語言是IT編程中最基礎的語言,在面試中,基本可以忽略又或者格外重要。下面是小編為大家整理的C語言精選面試題詳解,歡迎參考~分析這些面試題,本身包含很強的趣味性;而作為一名研發人員,通過對這些面試題的深入剖析則可進一步增強自身的內功。試題1:以下是引用片段:voi...
-
2017年計算機二級考試C語言備考題及答案
計算機二級對於很多考生來説還是比較有難度的,那麼怎樣順利通過二級考試呢?這就需要大家平時多練習和找方法了。以下是本站小編整理的2017年計算機二級考試C語言備考題及答案,希望對大家有幫助!1.(A)是構成C語言程序的基本單位。A、函數B、過程C、子程序D、子例...