一段话概括底层原理:在子类重写父类函数的情况下,子类的虚函数表中便会用子类重写函数的地址来覆盖父类虚函数的地址。使用父类指针指向子类对象时,父类指针存放的是子类对象的开头地址——即子类对象的虚函数表指针地址,而该指针又指向子类对象的虚函数表对应元素,该对应元素储存了子类重写过后的函数地址,因此调用的...
多态的本质原理:当符合多态条件时,调用时,到指向对象的虚表中找到对应的函数地址,进行调用。 普通函数在编译链接时会确定函数的地址,运行时直接调用。 构成多态时调用 非多态调用函数 构成虚表的条件 虚函数不是存在虚表中,而是在代码段,虚表中存的是虚函数的地址。 当基类没有被virtual修饰,而子类被virtual所修饰,...
当调用一个虚函数时, 编译器生成的代码会调用 虚表地址[0](param1, param2)这样的函数. 已经不是在调用函数名了. 当我们将虚表地址[n]中的函数实现改为另外的函数, 虚函数的实现就由我们来控制了. 实验 根据虚表原理, 实验一下修改自己程序的虚函数表项地址. 使编译器生成的代码执行一个虚函数A时, 执行...
/// 同一个类的对象虚表相同, 可以用静态成员函数指针数组代替 /// 在构造和析构时, 覆盖本对象虚表 /// 本类2个虚函数, 一个NULL static PFN_memberFn m_pfnMemberFnAry[e_MemberFnAry_size]; /// 如果要加入非静态成员变量, 需要定义虚表入口地址 size_t m_nAddrVirtualTableEntry;///< 虚表入口...