#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;
}
#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;
}
当用一个成员函数或数据成员时,你应该首先搞定它的this指针是指向哪个对象。
没关系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 的同名成员遮盖了,只能这样访问