C++ 继承和派生

继承和派生

在这里插入图片描述

继承的前提:分类

聚集(aggregation)
对于那些有明显层次之分的类,在构造后代类对象的时候,不是在其中包含一个前驱类对象,而是在前驱类对象的基础上,在其后面直接添加新的特征。这使得后代对象完全将前驱对象融合在自己内部,而且,每一个后代的前面部分就是一个完整的上一代前驱的对象
在C++和其它面向对象的语言中,聚集的实现过程被称为“继承(inheritance)”和“派生(derivation)

继承的优点
使程序员可以不必重头开始编写下层类,而只是在上层类的基础上进行修改和扩展。这使得类的可重用性可扩展性得到充分的体现。

继承和派生的概念

1.基本概念:基类和派生类
在最简单的情况下,如果说,一个类felid继承自类carnivore,那么通常将类carnivore称为“基类(base class) ”,或者“父类(parent class) ”;类felid称为carnivore类的“派生类(derived class) ”,或者“子类(child class) ”。

class 派生类名:access 基类类名//accsee为访问控制
{
   };

继承基类的所有成员
派生类实际上包含了它所有基类中除了构造函数、析构函数和赋值运算符之外的所有成员(思考:why?)

2.改造基类成员
方式一 通过不同的派生方式改造基类成员
方式二 就是在派生类中声明与基类成员同名的成员来覆盖基类成员

3.增加新的成员
根据派生类的实际特征,增加不同于基类的成员

从编码的角度,派生类从基类中以较低的代价换来了较大的灵活性。一旦产生了可靠的基类,只需要调试派生类中所做的修改即可。派生类从基类继承属性时,可使派生类对其进行限制,也可以改变或隐藏。

eg:

class carnivore
{
   
};
class felid : public carnivore
{
   
public:
	bool slitPupil;
};
 
class tiger : public felid
{
   
public:
    void roar() {
    std::cout << name << " roars" << std::endl; }
    //other members
};

在上述的三代继承中,几个类构成了继承的类等级。其中,felid是tiger的“直接基类”,carnivore是tiger的“间接基类”,或者称为“祖先类
这便就是类等级

如果要在派生类的成员函数中使用祖先类的成员,可以用如下语法:
祖先类名::祖先类成员
但这样做是不能访问基类的私有成员的。(如果一定要访问呢?——用protected)

4.访问控制
正如在上面的代码中示意的那样,C++中,派生类的一般语法形式为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会尽力回答你关于C++继承派生的问题。 首先,让我们考虑一个基础类——人员类(People),它应该包括人员的基本属性,例如姓名、性别、年龄等等。我们可以定义如下的类: ```c++ class People { public: People(string name = "", char gender = ' ', int age = 0) : m_name(name), m_gender(gender), m_age(age) {} void setName(string name) { m_name = name; } void setGender(char gender) { m_gender = gender; } void setAge(int age) { m_age = age; } string getName() const { return m_name; } char getGender() const { return m_gender; } int getAge() const { return m_age; } private: string m_name; char m_gender; int m_age; }; ``` 接下来,我们可以从人员类派生出学生类(Student)。学生类应该包括人员类的所有属性,同时还应该包括学生特有的属性,例如学号、班级等等。我们可以定义如下的类: ```c++ class Student : public People { public: Student(string name = "", char gender = ' ', int age = 0, int studentID = 0, string className = "") : People(name, gender, age), m_studentID(studentID), m_className(className) {} void setStudentID(int studentID) { m_studentID = studentID; } void setClassName(string className) { m_className = className; } int getStudentID() const { return m_studentID; } string getClassName() const { return m_className; } private: int m_studentID; string m_className; }; ``` 在学生类中,我们使用了关键字 `public`,这意味着学生类继承了人员类的所有公有成员。因此,在学生类的构造函数中,我们可以通过调用人员类的构造函数来初始化人员类的数据成员。 在学生类中,我们还定义了学生特有的数据成员,例如 `m_studentID` 和 `m_className`。我们还定义了一些成员函数,用于设置和获取这些数据成员。 使用上述代码,我们可以创建人员对象和学生对象,并使用它们的成员函数来设置和获取它们的属性。例如: ```c++ People p("Tom", 'M', 20); Student s("Alice", 'F', 18, 12345, "Class 1"); cout << p.getName() << " " << p.getGender() << " " << p.getAge() << endl; cout << s.getName() << " " << s.getGender() << " " << s.getAge() << " " << s.getStudentID() << " " << s.getClassName() << endl; ``` 输出结果为: ``` Tom M 20 Alice F 18 12345 Class 1 ``` 希望这个例子对你理解C++继承派生有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值