多态+菱形虚拟继承(下)
来源:互联网 发布:js数组和对象 编辑:程序博客网 时间:2024/06/11 03:52
对象的类型:
在这里先来看一下在继承体系中搞的人晕头转向的几个术语:
下面让我们一起进入多态的世界
多态(polymorphism)一词最初来源于希腊语polumorphos,含义是具有多种形式或形态的情形。
我们把具有继承关系的多个类型称为多态类型。
引用或指针的静态类型与动态类型不同这一事实正是c++语言支持多态性的根本所在。
1、多态分为静态多态和动态多态。
静态多态和动态多态还有下面的两种名字,其实意思都一样,但是为了以防我们以后见到这样的名字而不知所措,还是可以了解一下哒(笑脸):
(静态决议和动态决议)
(静态联编和动态联编)
静态多态:
编译器在编译期间完成,编译器根据实参的类型(可能会发生隐式类型转化),可推断出要调用哪个函数,如果没有对应的函数,则会出现编译错误。
动态多态:
在程序执行期间判断所引用对象的实际类型,根据实际类型调用相应的函数。动态多态的绑定:
①基类中必须要有虚函数—->在派生类中必须重写基类中的虚函数;
②必须使用基类的指针或引用去指向派生类的对象。
小结:通过基类的指针或引用调用虚函数时,调用基类还是派生类的虚函数,要在运行时根据指针(引用)指向(引用)的类型确定,当调用非虚函数时,无论指向的是哪种类型,一定调用的是基类的函数。
当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用,也只有在这种情况下对象的动态类型才有可能与静态类型不同。
示例1:
class Base{public : Base() :_b(3) { cout << "Base()" << endl; } void Show() { cout << _b << endl; }private : int _b;};class Derived :public Base{public : Derived() :_d(4) { cout << "Derived()" << endl; } void Show() { cout << _d << endl; }private : int _d;};void Print(Base* p){ p->Show();}void Test(){ Base b;//3 Derived d;//4 Print(&b); Print(&d);}int main(){ Test(); return 0;}
最终的结果都是3,与我们想要得到的答案不符。这是因为Show函数不是虚函数。从而验证了动态绑定的条件。
2.在派生类中进行重写(覆盖)的虚函数必须满足函数原型相同(参数列表,函数名,返回值类型(协变除外))。
补充下协变的概念:
协变:基类中的虚函数返回值类型为基类类型的指针或引用,并且派生类中重写的虚函数返回值类型为派生类类型的指针或引用。
示例如下:
class Base{public : Base() :_b(3) { cout << "Base()" << endl; } virtual Base* Show()//返回值类型为Base* { cout << _b << endl; return this; }private : int _b;};class Derived :public Base{public : Derived() :_d(4) { cout << "Derived()" << endl; } virtual Derived* Show()//返回值的类型为Derived* { cout << _d << endl; return this; }private : int _d;};void Print(Base* p){ p->Show();}void Test(){ Base b;//3 Derived d;//4 Print(&b); Print(&d);}
结果如下:
3.虚函数注意要点:
①不要在构造函数和析构函数内部调用虚函%
0 0
- 多态+菱形虚拟继承(下)
- 多态+菱形虚拟继承(下)
- 多态+菱形虚拟继承(下)
- 继承,菱形继承,多态,虚继承、菱形虚拟继承
- 菱形继承->菱形虚拟继承(继承系列问题)
- 继承,菱形继承,多态,虚拟继承,多虚拟继承,菱形虚拟继承
- 菱形继承&菱形虚拟继承
- 菱形继承&菱形虚拟继承
- 菱形继承--菱形虚拟继承
- 继承(二)--菱形继承,虚拟虚拟继承
- 继承*菱形继承与菱形虚拟继承
- 【C++】菱形虚拟继承(内存布局)
- 菱形虚拟继承
- 菱形的虚拟继承
- 浅谈菱形虚拟继承
- 菱形虚拟继承
- 菱形虚拟继承
- 菱形虚拟继承详解
- Dijkstra+DFS模板总结
- kafka自定义Integer序列化类
- 自己写一个数字地球
- java设计模式--组合模式(结构型)
- 动态存储网络——问答系统
- 多态+菱形虚拟继承(下)
- sublime中pre代码片段的设置
- java的blockingqueue
- Java 选择排序
- 【DP入门】石子合并(一)
- Java基于TCP实现服务器和多客户端之间的通信
- L1-019. 谁先倒
- 多态+菱形虚拟继承(下)
- jQuery( )方法的构建原理