13 繼承
13.1 繼承與訪問權限
繼承方式對子類內部沒啥影響,對外界有影響
|
|
父類公開成員 |
父類保護成員 |
父類私有成員 |
公開繼承 |
子類內部 |
可訪問(公開屬性) |
可訪問(保護屬性) |
不可訪問 |
外界 |
可訪問 |
不可訪問 |
不可訪問 |
|
私有繼承 |
子類內部 |
可訪問(私有屬性) |
可訪問(私有屬性) |
不可訪問 |
外界 |
不可訪問 |
不可訪問 |
不可訪問 |
|
保護繼承 |
子類內部 |
可訪問(保護屬性) |
可訪問(保護屬性) |
不可訪問 |
外界 |
不可訪問 |
不可訪問 |
不可訪問 |
13.2 派生類初始化
一般依照誰的成員誰維護,在初始化列表中把相應的參數傳到父類構造函數中。
Teacher(const char*name,bool gender,const char* course)//括號內包括基類所需的參數和子員變量
:Person(name,gender),course(course) //前面的括號裏是實參,可以是子類構造函數總參數表中的參數,也可以使常量和全局變量
13.3 子類同名函數覆蓋
子類可以改寫來自父類的成員函數,這樣把父類的同名成員函數隱藏起來 ,只要同名就會隱藏,與參數表,返回類型無關。
如果想訪問父類的同名函數,b.Person::show();
#include<iostream>
#include<string>
using namespace std;
typedef unsigned int unint ;
enum gender{F,M};
class Person
{
protected:
string m_name;
unint m_age;
gender m_g;
public:
Person(string name,unint age,gender sex):m_name(name),m_age(age),m_g(sex){};
void showme(){cout<<"我叫"<< m_name<<"今年"<< m_age<<"歲, "<<"是個"<<string(m_g==F?"帥鍋":"美呂")<<endl;};
};
class Teacher:public Person
{
string m_course;
public:
Teacher(string name,unint age,gender sex,string course);
void showme();
};
Teacher::Teacher(string name,unint age,gender sex,string course):Person(name,age,sex),m_course(course)
{};
void Teacher::showme()
{
cout<<"我叫"<< m_name<<"今年"<< m_age<<"歲, "
<<"是個"<<string(m_g==F?"帥鍋, ":"美呂, ")<<"還是個教"<< m_course<<"的老師。"
<<endl;
}
int main()
{
Person p("小明",18,F);
Teacher t("小紅",28,M,"數學");
cout << "父類對象調用父類函數:"<<endl;
p.showme();
cout << "子類對象調用子類對象:"<<endl;
t.showme();
cout << "子類對象調用父類函數:"<<endl;
t.Person::showme();
return 0;
}
輸出結果: