C++之 继承考点篇

                                         

继承(inheritance)是指一个对象直接使用另一对象的属性和方法。继承机制是C++设计中使代码可以复用的最重要的手段,在保持原有类特性的基础上进行扩展,增加功能。继承出来的新类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。
在一个类中,有三种访问限定符:public protected private.继承方式有相对应的三种,在不同继承方式后成员的访问变化。

继承需要注意的点:
1.public继承是一个接口继承,保持is-a原则,每个父类可用的成员对子类也可用,因为每个子类对象也都是一个父类对象。
在复制兼容规则中可以体现:
1).子类对象可以赋值给父类对象(切割/切片)
2). 父类对象不能赋值给子类对象
3). 父类的指针/引用可以指向子类对象
4). 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成)
父类=子类;(切割/切片)
Base &b1= d;
Base *b2 = &d;

上图为类对象的模型,可以很好帮助理解继承关系;
2. protected/private继承是一个实现继承,基类的部分成员并非完全成为子类接口的一部分,是 has-a 的关系原则。
简单举例一个继承
class Base
{
public:
Base()
{
cout<<"B()" <<endl;
}
~Base ()
{
cout<<"~B()" <<endl;
}
private:
int _pri;
protected:
int _pro;
public:
int _pub;
};
class Derived:public Base// class 基类名 :继承关系 父类
{
public:
Derived()
{
cout<<"D()"<<endl;
}
~Derived ()
{
cout<<"~D()"<<endl;
}
private:
int _d_pri;
protected:
int _d_pro;
public:
int _d_pub;
};
int main()
{
	Derived d;
	system("pause");
	return 0;
}

3.函数体执行顺序:
显示结果为先调用基类构造函数,但实际为在创建一个派生类的对象时(创建谁,先调谁的构造函数),首先调用派生类中的构造函数,
在其中(函数体:初始化列表的位置又调用了基类的构造函数,析构过程类似。
**** 如果在基类里面显式的定义了缺省的构造函数,在它的派生类里面系统才会合成成默认的构造函数;
****反之没有显示定义缺省构造函数(Base()),派生类必须在初始化列表里去显式的调用带参数的基类的构造函数(Base(6));
4.同名隐藏:当子类和父类中有同名成员时,子类成员将屏蔽父类对成员的直接访问,需要加作用域 d.Base::Test();
5.友元函数不属于基类,故友元关系不能继承,( 基类友元不能访问子类的protected,private成员);
6.单继承&多继承&菱形继承
1)单继承:子类有一个父类;
2)多继承:子类有俩个或更多父类
3)菱形继承:

在类C中,会有俩份基类成员,就会造成二义性和数据冗余;
为了解决这个问题而引入虚继承,格式如下:
class B1 : virtual public A
class B2 : virtual public A

在没有虚继承时C对象大小为20,虚继承之后大小为24;多出来的4个字节为虚指针指向虚表;
 
 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值