新手-虚函数继承问题

auto_ptr 2010-09-23 02:05:39
定义了三个类
#include <iostream.h>

class ClassTestA
{
public:
int m_data1;
int m_data2;
void func1() {}
void func2() {}
virtual void vfunc1() {}
virtual void vfunc2() {}

};

class ClassTestB:public ClassTestA
{
public:
int m_data3;
void func2() {}
virtual void vfunc1() {}


};

class ClassTestC:public ClassTestB
{
public:
int m_data1;
int m_data4;
void func2() {}
virtual void vfunc1() {}
};


//主函数如下

int main()
{

// cout<<"ClassTestA的大小:"<<sizeof(ClassTestA)<<endl;
// cout<<"ClassTestB的大小:"<<sizeof(ClassTestB)<<endl;
// cout<<"ClassTestC的大小:"<<sizeof(ClassTestC)<<endl;

ClassTestA classa;
ClassTestB classb;
ClassTestC classc;

classb.m_data1 = 1;
classb.m_data2 = 2;
classb.m_data3 = 3;
classc.m_data1 = 11;
classc.m_data2 = 22;
classc.m_data3 =33;
classc.m_data4 = 44;
classc.ClassTestA::m_data1 = 111;
classc.ClassTestA::m_data2 = 222;

cout<<"classb.m_data1:\t"<<classb.m_data1<<endl;
cout<<"classb.m_data2:\t"<<classb.m_data2<<endl;
cout<<"classb.m_data3:\t"<<classb.m_data3<<endl;
cout<<"classc.m_data1:\t"<<classc.m_data1<<endl;
cout<<"classc.m_data2:\t"<<classc.m_data2<<endl;
cout<<"classc.m_data3:\t"<<classc.m_data3<<endl;
cout<<"classc.m_data4:\t"<<classc.m_data4<<endl;
cout<<"classc.ClassTestA.m_data1:\t"<<classc.ClassTestA::m_data1<<endl;
cout<<"classc.ClassTestA.m_data2:\t"<<classc.ClassTestA::m_data2<<endl;


cout<<"classa对象的起始地址(实质是vptr指针的地址)\t"<<&classa<<endl;
cout<<"classa的成员变量m_data1地址\t"<<&classa.m_data1<<endl;
cout<<"classb对象的起始地址(实质是vptr指针的地址)\t"<<&classb<<endl;
cout<<"classb的成员变量m_data1地址\t"<<&classb.m_data1<<endl;
cout<<"classb的成员变量m_data2地址\t"<<&classb.m_data2<<endl;
cout<<"classb的成员变量m_data3地址\t"<<&classb.m_data3<<endl;

cout<<"classc对象的起始地址(实质是vptr指针的地址)\t"<<&classc<<endl;
cout<<"classc的成员变量m_data1地址\t"<<&classc.m_data1<<endl;
cout<<"classc的成员变量m_data2地址\t"<<&classc.m_data2<<endl;
cout<<"classc的成员变量m_data3地址\t"<<&classc.m_data3<<endl;
cout<<"classc的成员变量m_data4地址\t"<<&classc.m_data4<<endl;
cout<<"classc的成员变量ClassTestA::m_data1地址\t"<<&classc.ClassTestA::m_data1<<endl;
cout<<"classc的成员变量ClassTestA::m_data2地址\t"<<&classc.ClassTestA::m_data2<<endl;


return 0;
}

运行结果如下:



:1.ClassTestA::m_data1赋值是什么意思,是给classa的m_data1赋值,还是给ClassTestA类的m_data1赋值。。
2.为什么classc在内存中的地址为什么ClassTestA.m_data1的地址要排在最前面(紧挨在虚函数表的后面),而classc.m_data1确要排在classc.m_data3的后面,classc.m_data4的前面。如下图所示:


新手,求大虾帮助
...全文
101 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgsdzhaolanxiang1 2010-09-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 auto_ptr 的回复:]
第二个问题没注意,确实是继承的顺序。。顺便问下,能不能获得ClassTestA的地址。。。不是ClassTestA实例的地址
[/Quote]
貌似不能把。
auto_ptr 2010-09-23
  • 打赏
  • 举报
回复
第二个问题没注意,确实是继承的顺序。。顺便问下,能不能获得ClassTestA的地址。。。不是ClassTestA实例的地址

dingshaofengbinbin 2010-09-23
  • 打赏
  • 举报
回复
1、是给ClassTestA类的m_data1赋值
2、这个好像没什么吧,就是继承的先后顺序吧。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧