13.C++继承

本文介绍了C++中的继承概念,包括基类与派生类、作用域、友元关系和赋值转换。通过实例展示了如何创建和使用派生类,并解释了菱形继承和虚拟继承的问题及解决方案。强调了在继承体系中避免成员函数和变量名称冲突的重要性,以及友元关系不被继承的特性。

目录

继承的概念和定义

基类和派生类对象赋值转换

继承中的作用域

继承不继承友元关系

菱形继承和虚拟继承


继承的概念和定义

为了实现更高效的开发,人们思考类和类之间的复用,这就是继承的产生。允许程序员在保持原有类特性的基础上拓展,增加功能,这样产生的类是派生类,继承是类设计层次的复用。

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;

	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; // 学号
	};


	class Teacher : public Person
	{
	protected:
		int _jobid; // 工号
	};
	int main()
	{
		Student s;
		Teacher t;
		s.Print();
		t.Print();
		system("pause");
		return 0;
	}

我们通过上面代码可以知道,student和teacher是继承了person的成员变量和函数接口,也因此尽管它们每个都新增了成员变量, 打印出的也只有继承而来的成员变量,因为接口只是打印原来的成员变量。

我们来看一下继承的格式,上边person是父类,也叫做基类。student是子类,也叫做派生类。

 继承关系和访问限制符都有三类,public,protected,private。对应着派生类和基类之间的对应关系

绝大多数情况我们只用public继承,请熟悉。

基类和派生类对象赋值转换

1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切片或者切割。寓意把派生类中父类那部分切来赋值过去。
2.基类对象不能赋值给派生类对象。
3.基类的指针可以通过强制类型转换赋值给派生类的指针。但是必须是基类的指针是指向派生类对象时才是安全的。

继承中的作用域

1. 在继承体系中基类和派生类都有独立的作用域。
2. 子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。(在子类成员函数中,可以使用 基类::基类成员 显示访问)
3. 需要注意的是如果是成员函数的隐藏,只需要函数名相同就构成隐藏。
4. 注意在实际中在继承体系里面最好不要定义同名的成员。

class person
{
protected:
  _name = zy;
  _id = 123;
};

class student : public person
{
public:
  void print()
  {
    count << _name << endl;
    count << person::_id << endl;
    count << _id << endl;
  }
protected:
  int _id = 222;
};

void test()
{
 student s1;l
 s1.print();
};

继承不继承友元关系

友元关系不能继承,基类友元不能访问子类私有和保护成员。

菱形继承和虚拟继承

C++是支持多继承的,因此会产生菱形继承,产生一些问题,可以通过虚拟继承进行解决。

一个派生类只有一个父类是单继承,一个派生类有两个及以上父类是多继承。

菱形继承是多继承的一种情况。

 

 要解决菱形继承的问题,我们就要学习虚拟继承(此方法仅使用于此处),如下

class Person
{
public :
string _name ; // 姓名
};
class Student : virtual public Person
{
protected :
int _num ; //学号
};
class Teacher : virtual public Person
{
protected :
int _id ; // 职工编号
};
class Assistant : public Student, public Teacher
{
protected :
string _majorCourse ; // 主修课程
};
void Test ()
{
Assistant a ;
a._name = "peter";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学c的长弓狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值