C++基础知识–多态【For Maya plugin】

C++基础知识–多态
什么是向上映射
将派生类的对象、引用或指针转变为基类对象、引用、指针的活动被称为向上映射。
为什么被称作向上映射,而不是向下、向左、向右映射?
类继承关系图的传统画法中通常都是将基类画在上层,将派生类画在下层。例如:
Base
|
Derived
为什么能够向上映射
向上映射总是安全的。因为是从更专门的类型映射到更一般的类型——对于这个类接口可能出现的唯一的情况是它失去成员函数或者成员变量,而不会增加它们。这就是编译器允许向上映射而不需要显式说明或者作标记的原因。
向上映射的危机
看例子:
class base{
public:
void print(){
cout<<"base class"<print();
}
在上面的代码中,我们希望得到派生类指针所指内容print(),但是编译器却以指针的类型为主要参考依据,返回了基类的print()。如何避免这样的危机,而让指针能够根据地址取值而不是根据类型取值呢?
为什么会存在向上映射的危机?
因为:早绑定(静态绑定)
解决之道:晚绑定(动态绑定)|虚函数
Polymorphism allows a client to treat different objects in the same way even if they were created from different classes and exhibit different behaviors.
动态绑定的实现机制(三步)
1为每一个包含虚函数的类设置一个虚表(VTABLE)
每当创建一个包含有虚函数的类或从包含虚函数的类派生一个类时,编译器就会为这个类创建一个VTABLE。在VTABLE中,编译器放置了这个类中,或者它的基类中所有已经声明为 virtual 的函数的地址。如果在这
个派生类中没有对基类中声明为 virtual 的函数进行重新定义,编译器就使用基类的这个虚函数的地址。而且所有VTABLE中虚函数地址的顺序是完全相同的。
2初始化虚指针(VPTR)
然后编译器在这个类的各个对象中放置VPTR。VPTR在对象的相同的位置(通常都在对象的开头)。VPTR必须被初始化为指向相应的VTABLE。
3为虚函数调用插入代码
当通过基类的指针调用派生类的虚函数时,编译器将在调用处插入相应的代码,以实现通过VPTR找到VTABLE,并根据VTABLE中存储的正确的虚函数地址,访问到正确的函数。

作者: hmaya

developer!

看完不过瘾?点此向作者提问

《C++基础知识–多态【For Maya plugin】》有一个想法

发表评论

邮箱地址不会被公开。 必填项已用*标注