继承中的同名成员变量处理方法
1.当子类成员变量和父类成员变量同名时
2.子类依然从父类继承同名变量
3.在子类中通过作用域分辨符::进行同名成员区分(在子类中使用父类的同名成员,显式地使用类名限定符)
4.同名成员存储在内存中的不同位置
继承中的static关键字
继承和stataic关键字在一起会产生什么现象?
1.父类定义的静态成员,将被子类所共享
2.根据静态成员自身的访问特性和子类的继承方式,在类层次体系中具有不同的访问性质(遵守子类的访问控制)
3.子类中访问静态成员,用以下形式:
类名::成员
或通过对象名 对象名.成员
#### C++中构造函数没有写访问修饰符默认是私有的,继承的时候会编译出错.
多继承的应用
多继承的概念
一个类有多个直接的父类继承关系称为多继承
语法:
class 子类:访问修饰符 父类1,访问修饰符 父类2,......,访问修饰符 父类n{
}
多继承的子类构造和访问
多个父类的子类构造函数可以用初始式调用父类构造函数初始化数据成员
执行顺序与单继承情况类似。多个父类构造函数执行顺序取决于定义子类时指定的顺序
一个子类对象拥有多个直接或间接的父类成员。不同名成员访问不会出现二义性。如果不同的父类有同名成员,子类对象访问时应该加以识别。
当继承中出现二义性的时候可以使用虚继承(virtual)解决(由同一个祖父类继承而来的二义性),
多继承和虚继承是一种摈弃的用法,不推荐使用
多态原理探究
理论知识:
1) 当类中声明虚函数时,编译器会在类中生成一个虚函数表。
2) 虚函数表示一个存储类成员函数指针的数据结构
3) 虚函数表是由编译器自动生成和维护的
4) virtual成员函数会被编译器放入虚函数表中
5) 存在虚函数时,每个对象中都有一个指向虚函数表的指针
6) VPTR一个作为对象的第一个成员
7) 虚函数表指针是在构造函数执行之前被赋值,还是在构造函数被赋值后赋值?
多态实现效果
同样的调用语句有多种不同的表现形态.
多态实现的三个条件
继承、virtual重写、父类指针(引用)指向子类对象.
多态的C++实现
virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是根据指针所指向的实际对象类型来判断如何调用。
多态的理论基础
动态联编PK静态联编.根据实际的对象类型来判断重写函数的调用
多态的重要意义
设计模式的基础
实现多态的理论基础
函数指针作函数参数
C函数指针是C++至高无上的荣耀。C函数指针一般有两种用法(正,反)
静态联编和动态联编
1.联编是指一个程序模块、代码之间相互关联的过程。
2.静态联编(static binding),是程序的匹配、链接在编译阶段实现,也称为早期匹配。(重载函数使用静态联编)
3.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编(迟绑定)。
switch语句和if语句是动态联编的例子。
C++和C相同,是静态联编型语言
在编译时,编译器自动根据指针类型判断指向的是一个什么样的对象,所以编译器认为父类指针指向的是父类对象。
由于程序没有运行,所以不能指定父类指针所指向的具体是父类对象还是子类对象。
从程序安全角度,编译器假设父类指针指向父类对象,因此编译的结果为调用父类的成员函数。
C++多态的实现
virtual关键字,告诉编译器这个函数要支持多态;不要根据指针类型判断如何调用;而是根据指针所指向的实际对象类型来判断如何调用。virtual关键字修饰的函数叫虚函数。虚函数分:一般虚函数和纯虚函数.
虚析构函数
构造函数不能是虚函数。建立一个子类对象时,必须从类层次的根开始,沿着继承路径逐个调用父类的构造函数。
析构函数可以是虚的。虚析构函数用于指引delete运算符正确的析构动态对象。
函数重载:
必须在同一个类中进行。
子类无法重载父类的函数,父类同名函数将被名称覆盖
重载是在编译期间根据参数类型和个数决定函数调用
函数重写:
必须发生在父类和子类之间
并且父类和子类中的函数必须有完全相同的原型
使用virtual声明后能够产生多态(如果不使用virtual,那叫重定义)
多态是在运行期间根据具体对象类型决定函数调用.