面向对象三大特性之一——继承详解

本文详细探讨了面向对象编程中的继承特性,包括继承的概念、定义、基类和派生类的关系、默认成员函数、继承与作用域、继承与友元、静态成员、菱形继承以及虚拟继承的解决方案。文章还分析了继承的优缺点,并提倡使用组合来降低耦合度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、继承的概念与定义

1、继承的概念

2、继承的定义

2.1定义格式

 2.2继承关系和访问限定符

 二、基类和派生类的赋值转换

 三、继承中的作用域

四、派生类的默认成员函数

1、构造函数

2、拷贝构造函数

3、赋值运算符 

4、析构函数 

 五、继承和友元

六、继承与静态成员

七、菱形继承

1、继承的分类

2、菱形继承的问题

3、虚拟继承

3.1虚拟继承的概念

 3.2虚拟继承解决数据冗余和二义性的原理

 八、继承的总结与反思

1、继承的缺陷

2、继承和组合


前言

hello,小伙伴们大家好。相信对面向对象有一定了解的小伙伴都知道面向对象的三大特性为封装、继承、多态。封装特性我们已经在类和对象中体验到了,那么今天我们就来接着学习面向对象的继承特性。


一、继承的概念与定义

1、继承的概念

继承是面向对象程序设计的重要代码复用手段,它允许我们在保持原有类特性的基础上进行扩展,形成新的类,叫做派生类。继承体现了面向对象程序设计的层次结构。我们以前接触的都是函数复用,而继承是类的复用。

2、继承的定义

2.1定义格式

下面我们看到的Person是父类,也称为基类。Student是子类,也成为派生类。

 继承后父类的Person成员(成员变量和成员函数)都会成为Student的一部分。

class Person
{
public:
void Print()
{
cout << "name:" << _name << endl;
cout << "age:" << _age << endl;
}
protected:
string _name = "peter"; // 姓名
int _age = 18;  // 年龄
};


class Student : public Person
{
protected:
int _stuid; // 学号
};

 2.2继承关系和访问限定符

继承基类成员访问方式的变化:

类成员/继承方式 public继承 protected继承 private继承
基类的public成员 派生类的public成员 派生类的protected成员 派生类的private成员
基类的protected成员 派生类的protected成员 派生类的protected成员 派生类的private成员
基类的private成员 在派生类中不可见 在派生类中不可见 在派生类中不可见

 总结:

(1)当基类是private成员时,不论是什么继承,在派生类中都不可见。这里的不可见是指基类的私有成员虽然继承到了派生类当中,但由于语法的限制派生类对象不管在类里面还是在类外面都不能去访问它。

(2)如果想要基类成员不能在类外面被访问,但可以在派生类中被访问,可以把成员定义为protected。可以看出,protected这个概念就是专门为继承而生的。

(3)从上面的表格可以总结出,private成员在派生类中都不可见。而其它成员都适合派生类做对比,取最小权限做派生类的访问方式。

(4)使用关键字class默认的继承方式是private,使用关键字struct默认的继承方式是public,但一般最好写清楚继承方式。

 (5)在实际运用中一般使用都是public继承,几乎很少使用protetced/private继承,也不提倡使用protetced/private继承,因为protetced/private继承下来的成员都只能在派生类的类里面使用,实际中扩展维护性不强。

 二、基类和派生类的赋值转换

  • 派生类的对象可以赋值给基类的对象/基类的指针/基类的引用。这里有个形象的说法叫做切割,意思是把派生类中基类那部分切过来赋值过去。
  • 基类的对象不能赋值给派生类对象。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值