CPP 6th——类(6)
2015-12-11 11:02
274 查看
继承
继承是类与类之间的关系,是一个很简单很直观的概念,与现实世界中的继承(例如儿子继承父亲财产)类似。继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程。例如类B继承于类A,那么B就拥有A的成员变量和成员函数。被继承的类称为父类或基类,继承的类称为子类或派生类。
派生类除了拥有基类的成员,还可以定义自己的新成员,以增强类的功能。
以下是两种典型的使用继承的场景:
当你创建的新类与现有的类相似,只是多出若干成员变量或成员函数时,可以使用继承,这样不但会减少代码量,而且新类会拥有基类的所有功能。
当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,也可以使用继承。可以将这些类的共同成员提取出来,定义为基类,然后从基类继承,既可以节省代码,也方便后续修改成员。
#include<iostream> using namespace std; //基类--Pelple class People{ private: char *name; int age; public: void setName(char*); void setAge(int); char *getName(); int getAge(); }; void People::setName(char *name){ this->name = name; } void People::setAge(int age){ this->age = age; } char* People::getName(){ return this->name; } int People::getAge(){ return this->age;} //派生类--Student class Student: public People{ private: float score;//在继承People类的基础上派生出Student类。 //而且还新增了自己的成员变量score public: void setScore(float);//增加了自己的成员函数 float getScore(); }; void Student::setScore(float score){ this->score = score; } float Student::getScore(){ return score; } int main(){ Student stu; stu.setName("小明"); stu.setAge(16); stu.setScore(95.5f); cout<<stu.getName()<<"的年龄是 "<<stu.getAge()<<",成绩是 "<<stu.getScore()<<endl; return 0; }
本例中,People 是基类,Student 是派生类。Student 类继承了 People 类的成员,同时还新增了自己的成员变量 score 和成员函数 setScore、getScore。
派生类的定义格式:
class Student:public People
People前的public表示共有继承。
由此总结出的继承方式为:
class 派生类名:[继承方式] 基类名 { 派生类新增成员变量和成员函数; }
继承方式有private,public和protected继承的类型,如果不写,则默认为private类继承。
继承权限和继承方式
1)public继承方式基类中所有public成员在派生类中为public属性;
基类中所有protected成员在派生类中为protected属性;
基类中所有private成员在派生类中不可访问。
2)private继承方式
基类中的所有public成员在派生类中均为private属性;
基类中的所有protected成员在派生类中均为private属性;
基类中的所有private成员在派生类中均不可访问。
3)protected继承方式
基类中的所有public成员在派生类中为protected属性;
基类中的所有protected成员在派生类中为protected属性;
基类中的所有private成员在派生类中仍然不可访问。
由此可见:
1. 基类成员在派生类中的访问权限不得高于继承方式中指定的权限。例如,当继承方式为 protected 时,那么基类成员在派生类中的访问权限最高也为 protected,高于 protected 的会降级为 protected,但低于 protected 不会升级。
2. 基类中的 private 成员在派生类中始终是不可访问的。
private 继承限制太多,实际开发中很少使用,一般使用 public。
一个继承的例子:
#include<iostream> class People { private: char *name; int age; public: void setname(char*); void setage(int); void display(); }; void People::setname(char *name) { this->name=name; } void People::setage(int age) { this->age = age; } void People::display() { std::cout << name << "的年龄是" << age; } class Student :public People //派生类 { private: float score; public: Student(char*, int, float); void display1(); }; Student::Student(char *name, int age, float score) { this->setname(name); //由于name和age是基类中的私有成员变量 //派生类中的函数成员不能直接访问他们,因此调用基类中的成员函数来访问。 this->setage(age); this->score = score; } void Student::display1() { this->display(); std::cout << ",的成绩是" << score << std::endl; } int main() { Student stu("小明", 15, 96); stu.display1(); return 0; }
相关文章推荐
- C语言词法及语法定义-ANTLR
- Loadrunner C语言脚本常用函数总结
- C#调用C++dll文件获取数据得到乱码的解决方法
- C++实现自底向上的归并排序算法
- C++学习
- 交换两个数的值(C语言)的两种方法
- C++中 explicit的用法
- C++类构造函数初始化列表
- C++运算符重载
- HDU 1176 非倒序 动态规划写法 望指教
- C指针声明解读之左右法则
- 【转】C#与C/C++的交互
- C++句柄类详解
- 学生管理系统----用c语言在Xcode里编写 学生管理系统
- C++编码规范
- 第11周项目2 用二叉树求解代数表达式
- C++面试2(简答题)
- c语言排序,冒泡排序
- C语言开发简易版扫雷小游戏
- C++ 类包含关系Demo 笔记