博客
关于我
C++面向对象--------继承
阅读量:548 次
发布时间:2019-03-09

本文共 3151 字,大约阅读时间需要 10 分钟。

C++面向对象---继承

继承的定义

继承是C++语言中的一种核心概念,它让我们可以基于已有的类或结构创建新类,继承其属性和方法。在这种继承关系中,原有的类称为基类(Base Class),新创建的类称为派生类(Derived Class)。通过继承,我们可以封装代码重复,提高代码复用性和可维护性。在实际代码中,继承有两种常见类型:一对一继承和一对多继承。虽然一对多和多对一也是可能的,但最常见的是一对一继承。

一对一继承

一对一继承是指一个基类只能有一个派生类。这个概念类似于现实生活中的父子关系,一个父亲只能有一个儿子,但一个儿子有一个父亲。在C++中,一对一继承通过向基类的继承声明(using :声明)来实现。例如,人具有多个属性和方法,如姓名、年龄、身高和体重,以及一个方法来介绍自己。

例如:

#include 
using namespace std;
class People {
public:
string name;
double height;
double weight;
string age;
public:
void introduce() {
cout << "你好我叫 ";
cout << this->name;
cout << "!人身信息:身高" << this->height << "cm,体重" << this->weight << "kg,年龄" << this->age << endl;
}
};
class Teacher : public People {
public:
string profession;
};

完整代码:

#include 
using namespace std;
class People {
public:
string name;
double height;
double weight;
string age;
public:
void introduce() {
cout << "你好我叫 " << name << "!\n身高" << height << "cm,体重" << weight << "kg,年龄" << age << endl;
}
};
class Teacher : public People {
public:
string profession;
};
int main() {
Teacher Lisi;
Lisi.age = 18;
Lsi.height = 170.5;
Lsi.name = "李四";
Lsi.profession = "英语老师";
Lsi.weight = 50;
Lsi.introduce();
return 0;
}

这个例子中的People类是基类,Teacher类是派生类。派生类继承了基类的所有公有属性和方法,并在此基础上新增了独特的属性(如profession)。

在实际编码中,基类和派生类的访问级别(public、protected、private)会影响继承和访问的方式:

  • Public:所有派生类都可以访问基类的公有属性和方法。
  • Protected:派生类可以通过虚拟函数调用(如operator())间接访问保护的属性和方法,但不能直接访问。
  • Private:派生类无法直接访问基类的私有属性和方法。

一对多继承

一对多继承是指一个基类可以有多个派生类。在现实中,这相当于一个父亲可以有多个儿子。在C++中,我们可以通过将基类声明为多个不同的派生类来实现一对多继承。

例如:

#include 
using namespace std;
class People {
public:
string name;
double height;
double weight;
string age;
public:
void introduce() {
cout << "你好我叫 " << name << "!\n身高" << height << "cm,体重" << weight << "kg,年龄" << age << endl;
}
};
class Teacher : public People {
public:
string profession;
};
class Doctor : public People {
public:
string profession;
};
class Driver : public People {
public:
string profession;
};
int main() {
// 多个对象:
Teacher Lisi;
Doctor Wang;
Driver Zhang;
// 具体属性和逻辑可根据需要扩展
// 这里仅示意
Lisi.name = "李四";
Wang.name = "王五";
Zhang.name = "张六";
Lisi.introduce();
Wang.introduce();
Zhang.introduce();
return 0;
}

多对一继承

多对一继承是更为复杂的一种继承方式。在这种关系中,一个派生类可以继承多个基类的属性和方法。例如,在现实生活中,一个儿子可以有多个父亲,每个父亲传授不同的技能。这种多对一继承在C++中通过使用多继承(multi-inheritance)实现。

例如:

#include 
using namespace std;
class Driver {
public:
void driving() {
cout << "嘀嘀嘀!司机在开车\n";
}
};
class Doctor {
public:
void treatment() {
cout << "请问哪里不舒服?医生在治疗\n";
}
};
class Teacher {
public:
void teaching() {
cout << "学而时习之,不亦乐乎!老师在教育\n";
}
};
class Youngman : public Doctor, public Teacher, public Driver {
public:
string name;
int age;
double height;
double weight;
};
int main() {
Youngman Lisi;
Lisi.driving(); // 开车
Lisi.teaching(); // 教课
Lisi.treatment(); // 治疗
return 0;
}

注意到Youngman类同时继承了DriverTeacherDoctor三个类的属性和方法。这种双重继承(多继承)的实现让一个对象可以同时具有多个行为或属性。

转载地址:http://zbhiz.baihongyu.com/

你可能感兴趣的文章
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>