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;
}
输出结果: