博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在父类的构造函数中调用虚函数可以实现多态么?
阅读量:4210 次
发布时间:2019-05-26

本文共 763 字,大约阅读时间需要 2 分钟。

 

在父类的构造函数中调用虚函数是不能够实现多态的,这个问题涉及到vptr指针的初始化问题。

比如在构造子类对象c时,执行到父类的构造函数时,这个c.vptr指向的是父类的虚函数表,这时调用虚函数,执行的是父类的虚函数,不是多态。当执行完父类的构造函数,执行到子类的构造函数时,这个c.vptr指针这时才指向本身自己的虚函数表。注意,每一个对象都有一个vptr指针和一个虚函数表,这个是在编译时就提前布局了,而不是在运行时。

 

1)对象中的VPTR指针什么时候被初始化?

 

对象在创建的时,由编译器对VPTR指针进行初始化

只有当对象的构造完全结束后VPTR的指向才最终确定

父类对象的VPTR指向父类虚函数表

子类对象的VPTR指向子类虚函数表

 

2)分析过程

   画图分析

具体看如下,代码输出:

#include 
using namespace std;//构造函数中调用虚函数能发生多态吗?class Parent{public: Parent(int a=0) { this->a = a; print(); //这个调用的是父类的print函数,无多态发生 } virtual void print() { cout<<"我是爹"<
b = b; print(); //这个执行的是子类的print函数,有多态发生 } virtual void print() { cout<<"我是儿子"<
print(); //有多态发生 //2 动手脚 }void main(){ Child c1; //定义一个子类对象 ,在这个过程中,在父类构造函数中调用虚函数print 能发生多态吗? //c1.print(); cout<<"hello..."<

 

转载地址:http://lrzmi.baihongyu.com/

你可能感兴趣的文章
常见的排序算法
查看>>
5.PyTorch实现逻辑回归(二分类)
查看>>
6.PyTorch实现逻辑回归(多分类)
查看>>
8.Pytorch实现5层全连接结构的MNIST(手写数字识别)
查看>>
9.PyTorch实现MNIST(手写数字识别)(2卷积1全连接)
查看>>
hdu 3460 Ancient Printer(trie tree)
查看>>
中间数
查看>>
KMP求前缀函数(next数组)
查看>>
KMP
查看>>
poj 3863Business Center
查看>>
Android编译系统简要介绍和学习计划
查看>>
Android编译系统环境初始化过程分析
查看>>
user2eng 笔记
查看>>
DRM in Android
查看>>
ARC MRC 变换
查看>>
Swift cell的自适应高度
查看>>
【linux】.fuse_hiddenXXXX 文件是如何生成的?
查看>>
【LKM】整合多个LKM为1个
查看>>
【Windows C++】调用powershell上传指定目录下所有文件
查看>>
Java图形界面中单选按钮JRadioButton和按钮Button事件处理
查看>>