博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++构造函数中调用虚函数
阅读量:7113 次
发布时间:2019-06-28

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

谈谈关于构造函数中调用虚函数的情况,仅讨论单继承,不考虑虚拟继承和多重继承。
测试平台:VS2013 + Win7X64
一个例子:
#include 
#include
class Base{private: int __data;public: Base() { this->Func(); }public: virtual void Func() { printf("Base::Func"); }};class Deri : public Base{public: Deri() { this->Func(); }public: virtual void Func() { printf("Deri::Func\n"); }};int main(int argc, char** argv){ Deri d; getchar(); return 0;}
输出:
Base::Func
Deri::Func

首先讨论下对象d的构造情况。
1 先构造基类部分,调用基类Base的构造函数,这个时候,派生类部分还没有产生,这时候虚表应该是绑定基类的,自然调用的是Base::Func()
2 再构造派生类部分,这个时候,虚表发生变化,绑定在派生类上,调用Deri::Func()
虽然,在派生类中有重载Func这个函数,但是,在构造基类部分的时候,派生类的成员数据还没有初始化,如果是调用派生类中的Func,会造成错误,内存越界甚至崩溃。

在函数中,可以通过打印虚表地址:
-- Base::Func()
int* vtl = (int*)*((int*)this);
std::cout << "Base: " << this << "  VTable: " << vtl << std::endl;
-- Deri::Func()
int* vtl = (int*)*((int*)this);
std::cout << "Deri: " << this << "  VTable: " << vtl << std::endl;
输出:
Base: 0028F980  VTable: 003FDC78
Deri: 0028F980  VTable: 003FDC98
发现,虚表的地址是不断变化的。

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

你可能感兴趣的文章
php环境配置和nginx安装配置教程
查看>>
Python学习(21)python操作mysql数据库_操作
查看>>
ASCII
查看>>
TCP/IP协议(数据封装与拆装过程)
查看>>
我的 .npmrc 配置
查看>>
43、转换流
查看>>
ssh端口转发
查看>>
Tomcat.md
查看>>
javascript里用php
查看>>
【BO】SAP BO相关问题汇总贴
查看>>
最短路径(迪杰斯特拉算法)- 数据结构和算法64
查看>>
mac os x查看端口命令
查看>>
位语法
查看>>
redis的两种持久化方案
查看>>
[Python爬虫] 之九:Selenium +phantomjs抓取活动行中会议活动(单线程抓取)
查看>>
ElasticSearch 排序
查看>>
闭包 -> 函数的嵌套
查看>>
【Android自动化打包】03. APK的数字签名
查看>>
架构设计分享之权限系统(看图说话)
查看>>
【转载】ajax IE7,IE8浏览器请求本地资源出现access is denied拒绝访问
查看>>