C++之继承简谈

C++之继承

继承之前我们先简单介绍一下类。

  • 类是由成员函数和数据组成的一个整体,必须声明成员函数,但是定义成员函数是可选的。在类内部定义的函数默认为内联函数。也可以在类外通过作用域解析运算符::来定义成员函数。
  • 成员函数是通过对象来调用的,每个成员函数(除了静态成员函数)都有一个隐式形参this,当对象调用成员函数的时候,this初始化为调用函数的对象的地址。
  • 成员初始化列表和变量在类型中声明的顺序相同,和在构造函数的初始化列表中的顺序无关。

类对成员的访问形式

  1. 内部访问:由类中的成员函数对类的成员的访问
  2. 外部访问:类外部,通过类的对象对类的成员访问

三种访问属性

public,protected,private。类中的成员函数和友元函数可以访问类中的所有成员,但是在类外通过对象访问,只能访问类的共有成员。

继承

继承的形式:

class关键字的类默认成员是私有的,
struct关键字的类默认成员是共有的。
公有继承:表示基类是共有的,基类的公有成员和保护成员也成为子类的公有成员和保护成员,私有成员还是父类的私有成员,子类不可以访问这些成员。
私有继承:表示基类是私有的,基类的共有成员和保护成员成为子类的私有成员,并且不能被这个子类的子类访问。
保护继承:保护基类。基类的共有成员和保护成员成为子类的保护成员,子类对父类成员的访问和私有继承一样。
各个继承下子类对父类成员的访问规则:
公有继承:
在这里插入图片描述

私有继承:
在这里插入图片描述

继承的特点:

  1. 构造函数和析构函数都是类特有的,不能继承,所以为了对基类成员进行初始化,必须对派生类重新定义构造函数和析构函数,并且在派生类的构造函数初始化列表中调用基类的构造函数。
  2. 子类会继承父类的数据成员和成员函数,因此创建派生类对象的时候,系统首先通过派生类的构造函数来调用基类的构造函数,完成基类的初始化,而后对派生类中新增的成员初始化

单继承

一个父类多个子类的继承

class A{
public:
	A(){cout<<"A"<<endl;}
	~A(){cout<<"~A"<<endl;}
};
class B:public A{
public:
	B(A &a):_a(a){
		cout<<"B"<<endl;	
	}
	~B(){
		cout<<"~B"<<endl;	
	}
private:
	A _a;	
};
int main(){
	A a;//先调用A的构造函数
	B b(a);//首先,B继承A,创建对象会先调用基类A的构造函数对基类数据进行初始化
			//然后B的构造函数初始化类别利用拷贝构造函数构造了一个A对象,不输出但是析构要操作
			//然后调用子类B的构造函数进行子类中数据的初始化,
	return 0;
}

在这里插入图片描述

几个注意的点:

  1. 构造函数的初始化的格式要清楚,一般都将基类的构造函数放在派生类的初始化列表中,以调用基类构造函数完成基类数据成员的初始化,
  2. 对象删除的时候,先执行派生类的析构函数,再执行基类的析构函数

多继承

多个基类的继承情况。此时派生类的构造函数初始化列表需要调用各个基类的构造函数。

菱形继承

两个派生类B,C继承同一个基类A,又有一个子子类D同时继承两个派生类BC。
问题:
这样D就会继承B中A的数据,也会继承C中A的数据,导致A的数据会被D重复继承,而且引发访问不确定性和数据冗余问题。

class A{
private:
	int a;
};
class B:public A{
private:
	int b;
};
class C:public A{
...
}
class D:public B,public C{
...
}

虚继承

解决了菱形继承导致的二义性和数据冗余问题
实现方法:设置虚基类:让程序中只保留了一个共同基类的数据副本。
语法:class 派生类: virtual 基类1,virtual 基类2,…,virtual 基类n
{
…//派生类成员声明
};


class A{
private:
	int a;
};
class B:public A{
private:
	int b;
};
class C:public A{
...
}
class D:virtual public B,virtual public C{
...
}

参考:https://www.cnblogs.com/tianbatua112/p/11742478.html
<<C++primer plus>>
<<王道程序员面试宝典>>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值