码迷,mamicode.com
首页 > 其他好文 > 详细

继承&多态

时间:2016-04-08 15:21:48      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:继承&多态

   继承是面向对象的复用的重要手段。通过继承定义一个类,他们共享共有的东西,也可实现各自不同的东西。 

  类中有三种成员访问限定符:public,protected,private。

  类的继承方式也有三种:public继承,protected继承,private继承。


实现一个简单的继承关系:

技术分享

注:Bsae为基类(父类),D为派生类(子类)


三种继承关系下基类成员在派生类的访问关系变化:

技术分享总结:

(1)public成员在子类可以访问,在类外也可以访问。

(2)protected成员在子类中可以访问,但在类外不能访问。

(3)private成员在子类和类外都不可以访问。


继承与转换---赋值兼容规则

(1)子类对象可以赋值给父类对象

(2)父类对象不可以赋值给子类对象

(3)父类的指针或者引用可以指向子类

(4)子类的指针或者引用不可以指向父类(可以通过强制类型转换)

技术分享

注:每一个子类中都包含有父类。


单继承&多继承

1.单继承---一个子类只有一个父类

2.多继承---一个子类有多个父类

技术分享

注:Student类继承Person类,Graduate类继承Person类

    Assistant类继承Student类和Teacher类


菱形继承

技术分享

技术分享


菱形继承的对象模型:

技术分享

由模型中可以看出:

Assistion的对象中有两份Person成员。在测试过程中也能会造成二义性。Student类和Teacher类都继承Person,存在两份_name,使得数据冗余。


为了解决菱形继承的二义性和数据冗余问题,引入虚继承


菱形虚继承对象模型

技术分享


虚函数&多态


虚函数---类的成员函数前面加上virtual关键字,则这个成员函数为虚函数。

多态---派生类重写基类的虚函数实现多态。(虚函数重写)

多态的实现---虚表。


  1. 探索虚函数表

    虚函数表是通过一块连续内存来存储虚函数的地址。

    技术分享

    注: __vfptr是虚函数表指针,维护虚函数表。

2.探索单继承的对象模型

技术分享

注:在监视中只能显示d中所包含的父类的虚函数。(其实,虚函数表中还有子类的fun3)。因子类中重写了父类中虚函数fun1,所以父类中的fun1被子类的覆盖。

技术分享


3.探索多继承的对象模型

技术分享

注:D类继承Base类和Base1类。因子类中重写了父类的虚函数fun1,所以Base和Base1类的fun1被子类的覆盖。在Base类中的虚函数表的后边还存在D类中的虚函数fun3。


小结:

(1)派生类重写基类的虚函数,函数名,参数列表,返回值相同。但是协变例外。

(2)在父类中为虚函数,在子类中也为虚函数

(3)只有类的成员函数才能定义为虚函数

(4)静态成员函数不能定义为虚函数

(5)类外写成员函数,在声明处加virtual。

(6)构造函数不能定义为虚函数,最好不要将operator=定义为虚函数。

(7)不要在构造函数和析构函数中调用虚函数

(8)最好将父类析构函数定义为虚函数。(虽然父类和子类的构造函数名不同,但是由于编译器优化,子类的析构函数会覆盖父类的)


本文出自 “一起去看星星” 博客,转载请与作者联系!

继承&多态

标签:继承&多态

原文地址:http://10810429.blog.51cto.com/10800429/1761736

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!