虚函数详解及多态

 

单重继承无虚函数

 

 

查看地址 0x19fef0   查看内存  无偏移地址和跳转地址

 

 

单重继承有虚函数

 

 

 

 有虚函数跳转地址跟入地址查看

 

 得到b子类的虚函数 ,覆盖到了父类虚函数。

 

多重继承有虚函数

 

 

 得到了两个地址,跳转过去得到两个地址

 

 

 子类重写的虚类会覆盖父类虚表中对应的虚类

 

多重继承无虚函数

 

 

 

 

 那个父类有虚表会提前否则按顺序排列。那个父类有虚函数会为那个父类添加一个虚表

子类重写的虚函数会覆盖父类虚表中对应虚函数的位置

 

 

子类新添虚函数

 

 

 

 子类新添加的虚函数会挂在靠第一虚函数的父类的虚表中

 

单重虚继承无虚函数

虚基类位于内存的末尾,内存首地址存储着偏移块大小八字节,第二个字节保存虚基类到内存首地址偏移

 

 

 

 这个地址跳转的八字节前四字节表示跳转地址位于类地址的偏移大小和跳转地址到虚基类的偏移大小  前者有一般为负数 后者一般为正数

 

单重虚继承有虚函数

子类虚表指针

 

 偏移块指针

 

 子类数据

虚基类的虚表指针

 

 虚基类的数据

 

父类没有虚基类

 

 

虚表指针

 

 

 子类内存

子类虚表指针

偏移块指针

子类数据

虚基类的数据

 

多重虚继承 无虚函数

 

 

 

 第一顺位父类虚类偏移地址

第一顺位父类数据

第二顺位父类虚类偏移地址

第二位顺位父类数据

子类数据

虚基类数据

 

多重虚继承 有虚函数

 

 

  

 第一位顺位父类的偏移块指针

第一位父类的数据

第二位顺位父类的偏移块指针

 第二位父类的数据

子类数据

虚基类的虚表指针

虚基类的数据

子类重写或者添加新的虚函数都会挂在第一位顺位父类的虚表中

 

 

虚函数作用

有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。换句话说,基类指针可以按照基类的方式来做事,也可以按照派生类的方式来做事,它有多种形态,或者说有多种表现方式,我们将这种现象称为多态

 

C++提供多态的目的是:可以通过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,我们只能访问成员变量。

 

语法细节

在子类的一般成员函数中调用虚函数,是否有多态效果? -- 

在父类的一般成员函数中调用虚函数,是否有多态效果? -- 

在构造成员函数中调用虚函数,是否有多态效果? -- 没有,直接调用

在析构成员函数中调用虚函数,是否有多态效果? -- 没有,直接调用

构造是否可以是虚函数? -- 没有必要

析构是否可以是虚函数? -- 析构函数必须是虚函数

 

posted @ 2020-09-02 14:05  特权E5  阅读(224)  评论(0编辑  收藏  举报