#include <iostream.h>
#include <stdio.h>class ClassA
{
public:
int m_data1;
int m_data2;
void func1() {   }
void func2() {   }
virtual void vfunc1() {     }
virtual void vfunc2() {     }
};class ClassB : public ClassA
{
public:
int m_data3;
void func2() {  }
virtual void vfunc1() {   }
};class ClassC : public ClassB
{
public:
int m_data1;//此处定义了一个与前面的classA重复的数据成员
int m_data4;
void func2() {  }
virtual void vfunc1() {    }
};void main()
{
  cout << sizeof(ClassA) << endl;//运行结果为12,这可能吗,int不是2字节的吗,它说这里是2个int加一个指针,难道指针是8字节的?
  cout << sizeof(ClassB) << endl;
  cout << sizeof(ClassC) << endl;  ClassA a;
  ClassB b;
  ClassC c;  b.m_data1 = 1;
  b.m_data2 = 2;
  b.m_data3 = 3;
  c.m_data1 = 11;//系统怎么知道这是classC自己定义的数据成员,而不是继承来的成员?
  c.m_data2 = 22;
  c.m_data3 = 33;
  c.m_data4 = 44;
  c.ClassA::m_data1 = 111;//什么意思,有规定要这样的吗?换句话说,这是标准?  cout << b.m_data1 << endl;
  cout << b.m_data2 << endl;
  cout << b.m_data3 << endl;
  cout << c.m_data1 << endl;
  cout << c.m_data2 << endl;
  cout << c.m_data3 << endl;
  cout << c.m_data4 << endl;
  cout << c.ClassA::m_data1 << endl;  cout << &b << endl;
  cout << &(b.m_data1) << endl;
  cout << &(b.m_data2) << endl;
  cout << &(b.m_data3) << endl;
  cout << &c << endl;
  cout << &(c.m_data1) << endl;
  cout << &(c.m_data2) << endl;
  cout << &(c.m_data3) << endl;
  cout << &(c.m_data4) << endl;
  cout << &(c.ClassA::m_data1) << endl;  ClassB* pb = new ClassB;
  ClassC* pc = new ClassC;  pb->m_data1 = 1111;
  pc->m_data3 = 3333;  cout << (int)*((char*)pb+4) << endl;
  cout << (int)*((char*)pc+12) << endl;
}

解决方案 »

  1.   

    c.ClassA::m_data1 调用许函数的基类板笨其它我无法解释
      

  2.   

    int在现在一般的机子上都是4字节
      

  3.   

    类内数据成员重复不要紧,关键你要搞清this指针。
    当用一个成员函数或数据成员时,你应该首先搞定它的this指针是指向哪个对象。
      

  4.   

    1.;//此处定义了一个与前面的classA重复的数据成员
    没关系2. ;//运行结果为12,这可能吗,int不是2字节的吗,它说这里是2个int加一个指针,难道指针是8字节的?因为 vtable 指针(虚函数表),class A 实际用 C 表示是
    struct _A
    {
       int m_data1;
       int m_data2;
       struct _AVTable { 
           void (*lpvfunc1)(); // 函数指针 vfunc1
           void (*lpvfunc2)(); // 函数指针 vfunc2
       } * lpVtbl;    // vtable 指针
    }2;//系统怎么知道这是classC自己定义的数据成员,而不是继承来的成员?c.m_data1 // 访问的是classC自己定义的数据成员
    c.classA::m_data1 // 访问的是classA定义的数据成员3;//什么意思,有规定要这样的吗?换句话说,这是标准?
    因为 classA::m_data1 被 classC 的同名成员遮盖了,只能这样访问