C++中的继承

概念

继承可以实现代码复用,可以在保持原有类(基类)特性的基础上进行扩展,增加功能,产生新类(派生类)。继承呈现了面向对象程序设计的层次结构,是类设计层次的复用

定义

在这里插入图片描述

继承关系和访问限定符

在这里插入图片描述

  • 实际中一般使用都是public继承,几乎很少使用protect/private继承,
继承基类成员访问方式的变化

在这里插入图片描述

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

  1. 派生类的对象可以赋值给基类的对象/基类的指针/基类的引用。这种方式叫做切片或切割,寓意将子类中父类的那部分切出来赋值过去。
  2. 基类的对象不可以赋值给派生类对象。
  3. 基类的指针可以通过强制类型转换赋值给派生类的指针,但只有基类指针是指向派生类对象时才是安全的。
class B{
public:
	void set(int n){
		_b = n;
		cout << "B::set()" << endl;

	}
	int _b;

};

class D :public B{
public:
	void set(int n){
		_d = n;
		cout << "B::set()" << endl;
	}
	int _d;
};
int main(){
	D d;
	d.set(1);
	B b(d);//派生类的对象可以赋值给基类的对象、引用、指针
	B* bptr = &d;
	B& bs = d;

	b.set(0);//B::set()
	bptr->set(5);//B::set()
	bs.set(10);//B::set()

	cout << endl;
	B b1;
	b1.set(20);
	//D d1(b1);//基类的对象不可以赋值给派生类

	//D* d1 = &b1;error
	D* d1 = (D*)&b1;//基类的指针可以通过强制类型转换的方式赋值给派生类的指针
	d1->set(12);//D::set()
	system("pause");
	return 0;
}

继承中的作用域

  1. 在继承体系中基类和派生类都有独立的作用域。
  2. 子类和父类中有同名成员(成员变量、成员函数),如果使用子类对象访问继承体系中的成员,子类成员将屏蔽对父类成员的直接访问,这种方式叫隐藏,也叫重定义。(可以通过基类::基类成员显示访问);
  3. 只要基类和派生类中(不同作用域)出现函数名相同的函数就会构成隐藏
class B{
public:
	void set(int n){
		b = n;
		cout << "D::set()" << endl;

	}
	int b;
};

class D:public B{
public:
	void set(int n){
		d = n;
		cout << "B::set()" << endl;
	}
	int d;
};

int main(){
	D d1;
	d1.set(5);//D:set()
	d1.B::set(10);//通过这种方式访问基类成员 B::set()
	system("pause");
	return 0;
}

派生类的默认成员函数

  1. 派生类构造函数一定会在其初始化列表的位置调用基类的构造函数。(编译器自动调用基类的构造函数、需要用户显示的在派生类构造函数初始化列中初始化)
  • 如果基类中不存在构造函数或存在全缺省 的构造函数,派生类的构造函数可以实现也可不实现。
  • 如果基类存在半缺省的构造函数,则需要在派生类构造函数的初始化列表显示的调用基类的构造函数
  1. 派生类的拷贝构造函数必须调用基类的拷贝构造函数完成基类的拷贝初始化。
  2. 派生类的析构函数会被在调用完成后自动调用基类的析构函数清理基类成员。
注意
  1. 如何让实现一个不能被继承的类
  • 构造函数私有化
  • 使用关键字final;
  1. 不能被继承的类
  • 友元关系不能被继承,基类的友元函数不能访问派生类的私有与保护成员。
  1. 基类定义了静态成员变量,则整个体系只有一个这样的静态变量。

菱形继承与虚继承

菱形继承会造成数据冗余和二义性的问题。
虚继承会解决这两个问题。

  • 基类被派生类虚继承后会,派生类产生一个虚基表指针(会比普通继承后的类大小多4个字节),这个指针会指向一张虚基表虚基表中存放的是基类在内存中相对于派生类的偏移量,通过这个偏移量就可以找到基类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值