c++中继承-概念定义,基类派生类对象赋值转换,继承作用域(隐藏),派生类的默认成员函数如何实现,友元不能被继承,静态成员在继承中只有一份资源,多继承菱形继承(数据冗余二议)解决,继承与组合,继承总结

本文详细介绍了C++中的继承概念,包括继承的定义、访问限定符的影响,以及派生类如何实现默认成员函数。重点讨论了基类和派生类对象的赋值转换,继承作用域中的隐藏现象,以及多继承中菱形继承的数据冗余问题。同时强调了继承与组合的使用选择,建议在设计时避免复杂继承结构以提高代码质量和性能。
摘要由CSDN通过智能技术生成

**

继承的概念和定义

**
继承概念
1、继承是面向对象程序设计 使代码可以复用的手段。—这个是类层次设计的复用。
2、允许程序员保持 原有类 特性的基础上 进行扩展,增加功能
3、继承呈现了 面向对象程序设计的层次结构 ,体现了由简单到复杂的过程

class Person
{
   
public:
 void Print()
 {
   
   cout << "name:" << _name << endl;
   cout << "age:" << _age << endl;
 }
protected:
   string _name = "peter"; // 姓名
   int _age = 18; // 年龄
};
//Student继承Person,则父类的成员函数+成员变量都会变成子类的一部分。监视窗口看派生类对象,看到成员变量的复用,派生类调用Print可以啊看到成员函数的复用。
class Student : public Person
{
   
   void f()
	{
   
		//基类中的私有和保护在当前类没有什么差别
		//在继承后的子类中有差别,private在子类中不可见
		//cout << _age << endl;//继承基类的私有成员不可访问--把——age变成私有的话,这个不可访问
		cout << _name << endl;//继承基类的保护成员可以访问
	}
protected: 
   int _stuid; // 学号
};

class Teacher : public Person
{
   
protected:
 int _jobid; // 工号
};

继承定义
1、定义格式
在这里插入图片描述
继承关系和访问限定符
在这里插入图片描述
继承基类成员访问方式的变化
在这里插入图片描述
总结
1、基类的私有成员 不管什么继承方式 在派生类都不可见。对于派生类不管是类外还是类里面都不可以访问。对于基类,在类里面是可以访问的。
**2、**如果基类的成员不想在类外被直接访问,但是需要在派生类中可以访问它,可以将该成员在基类中定义为protected。protect就是因为继承才出现的。派生类继承的基类的protect成员,在派生类可以使用,但是类外不可以。
3、实际上面的表格我们进行一下总结会发现,基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式)
4、关键字class默认继承方式私有。struct默认继承方式共有,最好显示写出继承方式
5、实际使用一般都是public继承。因为protect和private继承下来成员都只能在派生类使用,扩展性不强。
2、基类和派生类对象赋值转换
1、派生类对象 可以赋值给基类的对象/基类的指针/基类的引用。这个可以考虑为切片。
2、基类对象不能直接赋给派生类对象
3、基类的指针 可以 强制类型转换 赋值给派生类的指针。
在这里插入图片描述

class Person
{
   
protected :
 string _name; // 姓名
 string _sex; // 性别
 int _age; // 年龄
};
class Student : public Person
{
   
public :
 int _No ; // 学号
};

void Test ()
{
   
    Student sobj ;
 // 1.子类对象可以赋值给父类对象/指针/引用
    Person pobj = sobj ;
    Person* pp = &sobj;
    Person& rp = sobj;
 //2.基类对象不能赋值给派生类对象
    sobj = pobj;//错误
 //3、基类的指针  可以  **强制类型转换** 赋值给派生类的指针。
    pp = &pobj;
    Student* ps = (Student*)pp;//这个转换是可以的,但是会越界访问。
    ps->_No = 10;//pp是基类指针,没有_No这个成员变量,但是强转给了student,可以改变_No,产生越界访问。

3、继承中的作用域
1、继承体系中基类和派生类都有独立的作用域。
2、子类父类中有同名的成员,子类成员将会屏蔽父类成员,访问的这个成员是子类的成员。–这个情况叫隐藏,也是重定义。想要访问父类成员的这个成员,可以使用 基类:基类成员。
3、如果构成成员函数的隐藏,那么函数名相同就可以构成隐藏。
4、所以最好继承体系中不要定义同名成员

//基类派生类中都有_num成员,所以子类的成员隐藏了父类(重定义)
class Person
{
   
protected:
	string _name = "小李子"; // 姓名
	int _num = 111; // 身份证号
};
class Student : public Person
{
   
public:
	void Print()
	{
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值