C++中的继承

C++中允许多继承,因此会出现同时继承多个父类变量的情况,也就是说,正常的继承是一棵树,而多继承的二义性使得继承成为了一个图。在C++中通过virtual关键字,来防止这种情况的发生。问题的本质在于,对于父类中的变量,有多种不同的形式来进行访问父类中的变量,解决问题的办法是在出现问题的类上,加一个virtual关键字(每个路径上),这样在进行继承的时候,在子类中只会加载父类一次,这样就避免了多种情况的存在。虚继承只能解决有共同父类的问题。多继承始终会存在问题,对于有共同父类的继承,虚继承可以解决,但是对于那种没有共同父类的多继承,使用虚继承是不能解决问题的,不过可以通过域作用符来解决。

使用sizeof操作符测试类对象的大小,之前知道,C++编译器是将类中的成员变量和成员函数分开存储的,成员变量的内存布局这内存访问方式和结构体的类似的。而对于加上virtual类使用sizeof操作符,发现会多几个字节,这说明,实现C++编译器实现virtual需要添加一些属性,从而占据了一些内存空间。

多态的条件

继承

虚函数重写

用父类指针指向子类对象。

联编:是指程序代码,模块之间相关关联的过程,

静态联编和动态联编:静态联编是程序的匹配,链接发生在编译阶段实现,重载函数使用的就是静态联编(重载函数的本质应该就是函数名+参数类型重新生成的一个新函数而已)。

动态联编是指程序联编推迟到运行时进行,所以有称为晚期联编,switch和if是动态联编的例子。

虚析构函数:

构造函数是不能使用virtual关键字,不过析构函数可以使用virtual关键字,可以用父类的指针来释放子类的对象。只要在基类析构函数上加一个virtual关键字。

函数的重载,重写,重定义:

额,这个我都不想写。

重载在同一个类中进行

重写必须在子父类中进行。

子类无法重载父类中的函数,父类中的同名函数在子类中将被覆盖。

重载是在编译器编译 期间,根据参数个数和参数类性决定的函数调用。

函数重写必须发生在子父类之间,并且字符类中的函数具有完全一致的函数三要素。使用virtual之后能够产生多台,如果不适用virtual,那叫重定义,多台是运行期间,根绝具体对象的类型决定函数的调用。

对于子类中重写的函数,就不能在在子类对象中调用父类中的同名称函数了,这个时候,只能通过域作用符来进行函数调用。

C++中的赋值兼容性原则:

子类对象可以当作父类对象使用,

子类对象可以直接赋值给父类对象

子类对象可以直接初始化父类对象

父类指针可以直接指向子类对象

父类引用可以直接指向子类引用

子类就是一种特殊的父类。

关于C++中引用的本质:

C++编译器中使用常量指针作为引用的内部实现,因此引用所占的空间大小和指针是一样的。

在继承,组合对象的情况下的构造函数的直行情况。

首先是直行父类的构造函数,然后直行子类的构造函数,最后在直行组合对象的构造函数,记得,在使用组合对应的构造函数的时候,一定要构造函数列表。析构函数的直行顺序是恰恰相反的。

继承中的同名变量和同名方法。

子类会对父类中的变量名称和方法进行覆盖。不过可以通过使用类域作用符访问父类中的变量和方法。

多继承的二义性,继承的时候需要指定继承的级别(public,protected,private)

C++中多态概念和java中是一样的。一种调用形式,在传递不同的参数的时候,有不同的函数行为。

对于子父类中的相同名称的方法,如果加上关键字virtual,称为函数重写(override),否则称为函数重定义,也就是子类中的方法会覆盖掉父类中的同名方法,要想访问父类中的同名方法,需要使用类域作用符才可以。

虚析构函数,可以使父类指针释放子类对象。

原文地址:https://www.cnblogs.com/andyniu/p/7825852.html