苏州门户网站,郑州影楼网站建设,软件开发网站模板,找培训机构的平台C继承的一般语法为#xff1a;class 派生类名:#xff3b;继承方式#xff3d; 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限#xff0c;包括 public#xff08;公有的#xff09;、private#xff08;私有的#xff09;和 protected#…C继承的一般语法为class 派生类名:继承方式 基类名{ 派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限包括 public公有的、private私有的和 protected受保护的。此项是可选项如果不写默认为 private成员变量和成员函数默认也是 private。现在我们知道public、protected、private 三个关键字除了可以修饰类的成员还可以指定继承方式。public、protected、private 修饰类的成员类成员的访问权限由高到低依次为 public -- protected -- private现在再来补充一下 protected。protected 成员和 private 成员类似也不能通过对象访问。但是当存在继承关系时protected 和 private 就不一样了基类中的 protected 成员可以在派生类中使用而基类中的 private 成员不能在派生类中使用下面是详细讲解。public、protected、private 指定继承方式不同的继承方式会影响基类成员在派生类中的访问权限。1) public继承方式基类中所有 public 成员在派生类中为 public 属性基类中所有 protected 成员在派生类中为 protected 属性基类中所有 private 成员在派生类中不能使用。2) protected继承方式基类中的所有 public 成员在派生类中为 protected 属性基类中的所有 protected 成员在派生类中为 protected 属性基类中的所有 private 成员在派生类中不能使用。3) private继承方式基类中的所有 public 成员在派生类中均为 private 属性基类中的所有 protected 成员在派生类中均为 private 属性基类中的所有 private 成员在派生类中不能使用。通过上面的分析可以发现1) 基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如当继承方式为 protected 时那么基类成员在派生类中的访问权限最高也为 protected高于 protected 的会降级为 protected但低于 protected 不会升级。再如当继承方式为 public 时那么基类成员在派生类中的访问权限将保持不变。也就是说继承方式中的 public、protected、private 是用来指明基类成员在派生类中的最高访问权限的。2) 不管继承方式如何基类中的 private 成员在派生类中始终不能使用不能在派生类的成员函数中访问或调用。3) 如果希望基类的成员能够被派生类继承并且毫无障碍地使用那么这些成员只能声明为 public 或 protected只有那些不希望在派生类中使用的成员才声明为 private。4) 如果希望基类的成员既不向外暴露不能通过对象访问还能在派生类中使用那么只能声明为 protected。注意我们这里说的是基类的 private 成员不能在派生类中使用并没有说基类的 private 成员不能被继承。实际上基类的 private 成员是能够被继承的并且成员变量会占用派生类对象的内存它只是在派生类中不可见导致无法使用罢了。private 成员的这种特性能够很好的对派生类隐藏基类的实现以体现面向对象的封装性。下表汇总了不同继承方式对不同属性的成员的影响结果继承方式/基类成员public成员protected成员private成员public继承publicprotected不可见protected继承protectedprotected不可见private继承privateprivate不可见由于 private 和 protected 继承方式会改变基类成员在派生类中的访问权限导致继承关系复杂所以实际开发中我们一般使用 public。【示例】演示类的继承关系。#includeiostream
usingnamespace std;//基类People
class People{
public:
voidsetname(char*name);
voidsetage(int age);
voidsethobby(char*hobby);
char*gethobby();
protected:
char*m_name;
int m_age;
private:
char*m_hobby;
};
void People::setname(char*name){ m_name name;}
void People::setage(int age){ m_age age;}
void People::sethobby(char*hobby){ m_hobby hobby;}
char*People::gethobby(){return m_hobby;}//派生类Student
class Student:public People{
public:
voidsetscore(float score);
protected:
float m_score;
};
void Student::setscore(float score){ m_score score;}//派生类Pupil
class Pupil:public Student{
public:
voidsetranking(int ranking);
voiddisplay();
private:
int m_ranking;
};
void Pupil::setranking(int ranking){ m_ranking ranking;}
void Pupil::display(){coutm_name的年龄是m_age考试成绩为m_score分班级排名第m_rankingTA喜欢gethobby()。endl;
}intmain(){
Pupil pup;pup.setname(小明);pup.setage(15);pup.setscore(92.5f);pup.setranking(4);pup.sethobby(乒乓球);pup.display();return0;
}运行结果小明的年龄是15考试成绩为92.5分班级排名第4TA喜欢乒乓球。这是一个多级继承的例子Student 继承自 PeoplePupil 又继承自 Student它们的继承关系为 People -- Student -- Pupil。Pupil 是最终的派生类它拥有基类的 m_name、m_age、m_score、m_hobby 成员变量以及 setname()、setage()、sethobby()、gethobby()、setscore() 成员函数。注意在派生类 Pupil 的成员函数 display() 中我们借助基类的 public 成员函数 gethobby() 来访问基类的 private 成员变量 m_hobby因为 m_hobby 是 private 属性的在派生类中不可见所以只能借助基类的 public 成员函数 sethobby()、gethobby() 来访问。在派生类中访问基类 private 成员的唯一方法就是借助基类的非 private 成员函数如果基类没有非 private 成员函数那么该成员在派生类中将无法访问。改变访问权限使用 using 关键字可以改变基类成员在派生类中的访问权限例如将 public 改为 private、将 protected 改为 public。注意using 只能改变基类中 public 和 protected 成员的访问权限不能改变 private 成员的访问权限因为基类中 private 成员在派生类中是不可见的根本不能使用所以基类中的 private 成员在派生类中无论如何都不能访问。using 关键字使用示例#includeiostream
usingnamespace std;//基类People
class People{
public:
voidshow();
protected:
char*m_name;
int m_age;
};
void People::show(){cout m_name 的年龄是 m_age endl;
}//派生类Student
class Student:public People {
public:
voidlearning();
public:
using People::m_name;//将protected改为public
using People::m_age;//将protected改为public
float m_score;
private:
using People::show;//将public改为private
};
void Student::learning(){cout 我是 m_name 今年 m_age 岁这次考了 m_score 分 endl;
}intmain(){
Student stu;stu.m_name 小明;stu.m_age 16;stu.m_score 99.5f;stu.show();//compile errorstu.learning();return0;
}代码中首先定义了基类 People它包含两个 protected 属性的成员变量和一个 public 属性的成员函数。定义 Student 类时采用 public 继承方式People 类中的成员在 Student 类中的访问权限默认是不变的。不过我们使用 using 改变了它们的默认访问权限如代码第 21~25 行所示将 show() 函数修改为 private 属性的是降低访问权限将 name、age 变量修改为 public 属性的是提高访问权限。因为 show() 函数是 private 属性的所以代码第 36 行会报错。把该行注释掉程序输出结果为我是小明今年16岁这次考了99.5分