1.多态:通常是指对于同一个消息、同一种调用,在不同的场合,不同的情况下,执行不同的行为--->重载便是简单的多态
------->指同一个操作作用于不同的对象就会产生不同的响应;
多态性分为静态多态性和动态多态性
其中函数重载和运算符重载属于静态多态性, 虚函数属于动态多态性---->C++是依靠虚函数来实现动态多态的。
2.C++编译器根据传递给函数的参数和函数名决定具体要使用哪一个函数,称为联编:
1)在编译过程中进行的联编叫静态联编(static binding)或早期联编(early binding)。
2)在程序运行时完成,动态联编”(dynamic binding)也叫晚期联编(late binding)---->C++通过虚函数来实现动态联编
3.虚函数:vitual
1.与基类的虚函数有相同的参数个数;
2.与基类的虚函数有相同的参数类型;
3.与基类的虚函数有相同的返回类型。
注意点:1.基类的成员函数定义为虚函数,那么,它在所有派生类中也保持为虚函数;即使在派生类中省略了virtual关键字,也仍然是虚函数。
2.构造函数不可为虚函数--->一旦为虚函数相当于重新,在构造子类时无法找到基类构造函数从而无法构造对象。
(1. 根据继承的性质,构造函数执行顺序是: A() B() 2. 根据虚函数的性质,如果A的构造函数为虚函数, 且B类也给出了构造函数,则应该只执行B类的构造函数, 不再执行A类的构造函数。这样A就不能构造了。 3. 这样1和2就发生了矛盾.)
3.同名函数不管参数如何,子类会隐藏父类的成员函数
4. 虚函数的访问
1)对象名的访问:此时取决于对象名的类型---->在类中还可使用作用域符指明
2)指针访问:指针访问非虚函数时,根据指针本身的类型决定要调用哪个函数,而不是根据指针指向的对象类型; 使用指针访问 虚函数时,编译器根据指针所指对象的类型决定要调用哪个函数(动态联编),而与指针本身的类型无关。------->使用指针访问是虚函数调用的最主要形式
3)引用访问: 与使用指针访问虚函数类似--->不同:引用一经声明后,引用变量本身无论如何改变,其调用的函数就不会再改变,始终指向其开始定义时的函数。
---->受限制的指针。
base obj_base; //创建基类对象 base& rBase1 = obj_base; //声明基类引用,用基类对象初始化 rBase1.disp(); //基类引用 调用虚函数: 基类中的disp版本 child obj_child; //创建派生类对象 base& rBase2 = obj_child; //声明基类引用,用派生类对象初始化 rBase2.disp(); //基类引用 调用虚函数: 派生类中的disp版本 cout << endl; //引用一经声明后,其调用的函数就不会再改变 rBase1 = obj_child; //引用本身不可以改变, 这里是将obj_child赋值给 //了rBase1指向的obj_base,相当于obj_base = obj_child; rBase1.disp(); //还是调用原来的虚函数: 基类版本