• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 虚拟多重继承对象模型高手来帮忙

虚拟多重继承对象模型高手来帮忙

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了多重从属对象 句柄,cad多重从属对象,多重从属对象,cad警告多重从属对象,警告多重从属对象等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 虚拟多重继承对象模型 高手来帮忙
描述:

#include "stdafx.h"
#include "iostream.h"
class AA
{
public:
int  naa;
public:
void fa();
AA()
{
naa = 0;
}
virtual AA* printfa()
{
cout<<"class A"<<endl;
return this;
}
};
class BB:public virtual AA
{
public:
int  nbb;
public:
BB()
{
nbb = 1;
}
void fb();
virtual void printfb()
{
cout<<"class B"<<endl;
}
};
class CC:public virtual AA
{
public:
int  ncc;
public:
CC()
{
ncc = 2;
}
void fc();
virtual void printfc()
{
cout<<"class C"<<endl;
}
};
class BBCC:public BB,public CC
{
public:
int  nbbcc;
public:
BBCC()
{
nbbcc = 12;
}
void fbc();
virtual void printfbc()
{
cout<<"class BC"<<endl;
}
};
int main(int argc, char* argv[])
{
AA* aa = new AA;
aa->printfa();
BB* bb = new BB;
bb->printfb();
CC* cc = new CC;
cc->printfc();
BBCC* bbcc = new BBCC;
bbcc->printfbc();
cout<<sizeof(AA)<<endl;
cout<<sizeof(BB)<<endl;
cout<<sizeof(CC)<<endl;
cout<<sizeof(BBCC)<<endl;
return 0;
}
bb和cv为什么占20个空间?
bb的内存布局:
00431B40  30 60 42 00   //应该是个指针
00431B44  34 60 42 00   //应该是个指针
00431B48  01 00 00 00
00431B4C  2C 60 42 00   //应该是个指针
00431B50  00 00 00 00
为什么有3个指针呢?
bbcc的内存布局:
00431AB0  74 60 42 00
00431AB4  8C 60 42 00
00431AB8  01 00 00 00
00431ABC  70 60 42 00
00431AC0  80 60 42 00
00431AC4  02 00 00 00
00431AC8  0C 00 00 00
00431ACC  6C 60 42 00
00431AD0  00 00 00 00 
好象有5个指针的,他们是什么呢?
知道的朋友来帮帮我
另外若要调用 AA->fa(); 编译器怎么实现   怎么找fa()的地址?
aa = new AA;   着时候产生this 指针吗?
问题与点多哦!分给的少了点吧! 没办法了 最多只能给100了。


解决方案1:

第一个问题:bb和cc为什么占20个空间?
aa是8个字节,这没有问题,bb是虚拟继承至aa,它除了有一个成员变量,一个虚表指针外,还有一个指向aa相对地址的指针,所以为20字节,cc也是如此。
第2个问题:
00431B40  30 60 42 00   //应该是个指针
00431B44  34 60 42 00   //应该是个指针
00431B48  01 00 00 00
00431B4C  2C 60 42 00   //应该是个指针
00431B50  00 00 0
通过上面的回答,你该知道了吧
关于this指针,调用函数编译器就会为你在函数的参数中加上一个this指针的
第3个问题:
bbcc的内存布局:
00431AB0  74 60 42 00
00431AB4  8C 60 42 00
00431AB8  01 00 00 00
00431ABC  70 60 42 00
00431AC0  80 60 42 00
00431AC4  02 00 00 00
00431AC8  0C 00 00 00
00431ACC  6C 60 42 00
00431AD0  00 00 00 00 
5个指针分别是3个虚表指针,还有2个指针指向的是aa的基地址

解决方案2:

非虚函数并非运行时找地址,而是编译的时候编译器就指定了相对地址。

解决方案3:

mark

解决方案4:

mark 一个,顶

解决方案5:

aa是AA类型,所以直接传对象地址,翻译成c的写法就是AA_fa(aa);如果是bb->fa()的话,就是AA_fa(bb->getAA());这样的过程。虚拟继承的类型转换是运行期计算的。

解决方案6:

C++对象模型一书里对此有详细解释,另外各家编译器厂商实现也不尽相同。
bbcc里的五个指针分别是三个AA、BB、CC的虚表指针,两个将BB、CC类转换为AA的偏移指针。

解决方案7:

哦
那我就接分了哈


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 如何获得OleContainer中的对象的句柄?
  • 虚拟多重继承对象模型高手来帮忙

相关文章

  • 2017-06-04 MFC中连接mysql的API如何配置和使用。求教。300分求。
  • 2017-06-05 windows自带的线程池
  • 2017-06-04 如何创建一个自动化控件
  • 2017-06-04 释放画笔后为什么后边画的圆的边框也带画笔颜色呐
  • 2017-06-05 DLL调用!请指点一下,谢谢!
  • 2017-06-05 请问在程序设计时,如何充分发挥两个cpu的作用?
  • 2017-06-05 IAccessibleaccSelect失效?
  • 2017-06-05 ActiveX控件与WindowsMediaPlayer控件冲突
  • 2017-06-05 如何在控制台程序中实现一个定时启动的线程序?
  • 2017-06-05 是否是线程安全问题?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 我在控件中调用IsDialogMessage出错。
    • WindowLess的ActiveX控件能否接收OnTime事件?
    • 小弟出学VC编程有一事不明,请大家帮忙!
    • 自动化里面怎么获得网页触发函数名称?
    • CToolTipCtrl为什么不出现提示?
    • exe扩展名的COM为什么看不到DllGetClassObject等函数呢
    • 关于线程循环执行的问题
    • MAKEINTRESOURCE进行地址转换时的问题
    • 关于char返回类型
    • MFCTab控件的问题

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有