C++:构造函数中调用虚函数
来源:互联网 发布:淘宝联盟钱多久返利 编辑:程序博客网 时间:2024/04/30 17:55
好儿郎~志在四方
时光就这样流逝,怎能不心痛。
【1024程序员节】获奖结果公布 【观点】有了深度学习,你还学传统机器学习算法么? 【资源库】火爆了的React Native都在研究什么
C++:构造函数中调用虚函数
标签: C++构造函数中调用虚函数
2016-10-17 16:07 68人阅读 评论(0)收藏举报
本文章已收录于:
分类:
作者同类文章X
- •C++:什么情况下需要将析构函数定义为虚函数?
- •C++编程经验分享
- •C、C++中使用const提高程序的健壮性和效率
- •C++中四种类型转换运算符的使用方法(reinterpret_cast,const_cast,static_cast,dynamic_cast)
- 更多
目录(?)[+]
- C交流群 302558294欢迎你的加入
- 原文地址httpblogcsdnnetalex_myarticledetails44017509 感谢原作者总结分享
C++交流群: 302558294(欢迎你的加入)
原文地址:http://blog.csdn.net/alex_my/article/details/44017509 ,感谢原作者总结分享
谈谈关于构造函数中调用虚函数的情况,仅讨论单继承,不考虑虚拟继承和多重继承。
测试平台:VS2013 + Win7X64
一个例子:
#include <stdlib.h>
#include <stdio.h>
class Base
{
private:
int __data;
public:
Base()
{
this->Func();
}
public:
virtual void Func()
{
printf("Base::Func");
}
};
class Deri : public Base
{
public:
Deri()
{
#include <stdio.h>
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;
}
}
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
Deri: 0028F980 VTable: 003FDC98
发现,虚表的地址是不断变化的。
- 顶
- 0
- 踩
- 0
- 上一篇C++:什么情况下需要将析构函数定义为虚函数?
- 下一篇Qt:图片翻转(水平、垂直、顺时针、逆时针)
我的同类文章
http://blog.csdn.net
- •C++:什么情况下需要将析构函数定义为虚函数?2016-10-17
- •C、C++中使用const提高程序的健壮性和效率2016-08-30
- •Visual Studio中出现This function or variable may be unsafe错误提示2016-07-27
- •Thinking in C++: 第1章 为什么C++会成功2016-07-16
- •Thinking in C++: 第1章 继承:类型关系2016-07-15
- •C++编程经验分享2016-08-30
- •C++中四种类型转换运算符的使用方法(reinterpret_cast,const_cast,static_cast,dynamic_cast)2016-08-25
- •C++: 友元函数和友元类详解2016-07-17
- •Thinking in C++: 第1章 多态性2016-07-15
- •Thinking in C++: 第1章 对象=特性+行为2016-07-15
参考知识库
.NET知识库
- 猜你在找
- C++ 单元测试(GoogleTest)
- 《C语言/C++学习指南》数据库篇(MySQL& sqlite)
- C/C++单元测试培训
- c++面向对象前言及意见征集(来者不拒)视频课程
- Linux环境C++编程基础视频课程
更多资料请参考:
核心技术类目
全部主题HadoopAWS移动游戏JavaAndroidiOSSwift智能硬件DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript数据库UbuntuNFCWAPjQueryBIHTML5SpringApache.NETAPIHTMLSDKIISFedoraXMLLBSUnitySplashtopUMLcomponentsWindows MobileRailsQEMUKDECassandraCloudStackFTCcoremailOPhoneCouchBase云计算iOS6RackspaceWeb AppSpringSideMaemoCompuware大数据aptechPerlTornadoRubyHibernateThinkPHPHBasePureSolrAngularCloud FoundryRedisScalaDjangoBootstrap
- 我的简介:
- 姓名:何树培
专注:C++、Qt程序开发
专业:计算机科学与技术
母校:四川理工学院
联系我:
我的QQ:913970877
C++交流群: 302558294
- 个人资料
- 访问:149784次
- 积分:4076
- 等级: 积分:4076
- 排名:第5645名
- 原创:211篇
- 转载:44篇
- 译文:2篇
- 评论:155条
好儿郎-志在四方
- 博客专栏
- Linux环境下C程序开发
文章:24篇
阅读:20601 三级数据库等级考试文章:9篇
阅读:4700 蓝桥杯文章:21篇
阅读:11503- 阅读排行
- MFC、VC++综合作业题(4600)
- 小何讲进程: Linux进程控制编程 (fork、vfork)(4402)
- C++标准库和标准模板库(4175)
- 《Windows程序设计》复习题(3729)
- 小何讲Linux: 基本文件操作和实例(3621)
- 在Qt中使用C++代码创建界面(3055)
- 软件测试技术之: 白盒测试和黑盒测试(2954)
- 小何讲进程: 编写Linux守护进程方法详解(2737)
- 用C语言讲一讲位运算 入门级(详细图解)(2544)
- Qt: 创建具有复选框的树形控件(2267)
- 文章分类
- C++程序设计浅尝(44)
- C程序设计浅尝(18)
- 蓝桥杯大赛(24)
- linux学习历程(36)
- MFC浅尝(16)
- Qt编程浅尝(67)
- DOS浅尝(2)
- 51单片机学习(6)
- ARM企业实训(4)
- 算法与数据结构(11)
- 全国计算机等级考试三级数据库(9)
- Android入门(0)
- 趣味编程(1)
- Java历程(1)
- ACM程序设计(1)
- C、C++面试集锦(9)
- 网页设计(1)
- 电脑操作小技巧(6)
- 大学生活+感悟记录(8)
- 杂七杂八(5)
- 文章存档
- 2016年10月(18)
- 2016年09月(12)
- 2016年08月(10)
- 2016年07月(19)
- 2016年06月(24)
- 2016年05月(34)
- 2016年04月(32)
- 2016年03月(30)
- 2016年02月(11)
- 2016年01月(26)
- 2015年12月(11)
- 2015年11月(9)
- 2015年10月(5)
- 2015年09月(13)
- 2015年07月(2)
- 2015年06月(1)
- 文章搜索
- 评论排行
- 我的求职简历(大三学生)(22)
- 试问蓝桥杯有多水,一道题就能回答你(吐槽,坑)(13)
- 祝贺我的博客访问量过万(访问量:10260次)(13)
- 学IT,看教程,看视频,你必须知道的学习网站(9)
- C++面试题:三种数值交换方法(9)
- Linux常用命令大搜罗、大总结(5)
- 蓝桥杯 — 加法变乘法(把其中两个不相邻的加号变成乘号)(4)
- Qt: qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写(4)
- 蓝桥杯 历届试题 核桃的数量(4)
- 聚合与组合的区别(3)
- 最新评论
- 手把手教你:用Qt做一个漂亮的电子时钟(纯代码)
好儿郎-志在四方:@miao19920101:不妨贴出你的代码看一看吧。
- 手把手教你:用Qt做一个漂亮的电子时钟(纯代码)
好儿郎-志在四方:@miao19920101:没有原程序,定位不了你的程序出错误的原因。
- 手把手教你:用Qt做一个漂亮的电子时钟(纯代码)
miao19920101:我qDebug除了但到时 hh:mm:ss 但是显示的只有mm:ss为什么呢
- 如何在CSDN博客中插入动态图(GIF)
HongdengLi:正好需要,谢谢了
- Qt: 多线程,继承QThread,重写run(理论+实例)
好儿郎-志在四方:@z609932088:天天向上。
- Qt: 多线程,继承QThread,重写run(理论+实例)
DreamLife-i:好好学习
- Qt多线程:QtConcurrent配合lambda表达式(实例)
DreamLife-i:搜藏,日后学习
- 第二章:10道C/C++经典面试题
adj2010:单链表反转感觉有点问题,应该这样tmp = cur;cur = cur.next;tmp.next ...
- 我的求职简历(大三学生)
独立风华:别写“擅长Office、WPS等办公软件的使用”,没啥意义
- Qt creator 编译错误:无法解析的外部符号(命令)
好儿郎-志在四方:亲测可用。
您有5条新通知
0 0
- C++:构造函数中调用虚函数
- C++:构造函数中调用虚函数
- 在构造函数中调用虚函数
- 构造函数中调用虚函数?
- C++构造函数中调用虚函数
- 构造函数中调用虚函数
- 构造函数中调用虚函数
- 构造函数中调用虚函数
- 构造函数中调用虚函数---C++
- 构造函数中调用虚函数
- 在构造函数中调用虚函数
- 构造函数中调用虚函数?
- 构造函数中调用虚函数
- 构造函数中调用虚函数?
- 构造函数中调用虚函数
- C++构造函数中调用虚函数
- 构造函数中调用虚函数?
- 构造函数中不要调用虚函数
- ffpemg使用四:ffmepg解码+Qt显示即播放器的实现
- java——finalize
- Linux命令之"traceroute"
- 异常处理
- 机器学习之hypothesis具体是什么样的??
- C++:构造函数中调用虚函数
- SVN 常用命令
- #pragma指令用法汇总和解析
- 音视频学习资料
- 第十周项目2-二叉树遍历的递归运算
- Qt 在windows下应用程序的图标更改和exe发布
- 为运动员打分的程序及我所犯的错误
- 敏捷核心思想、设计模式与过度设计
- Butter Knife 配置和使用及插件
暂无评论