code0.cpp 热身一下C++, 无继承:
#include <iostream>
using namespace std;
class A
{
public:
int x;
};
class B
{
public:
int x;
};
int main()
{
cout << sizeof(A) << endl; // 4
cout << sizeof(B) << endl; // 4
A a;
printf("%p\n", &a.x); // 0013FF7C
printf("%p\n", &a.A::x); // 0013FF7C
B b;
printf("%p\n", &b.x); // 0013FF78
printf("%p\n", &b.B::x); // 0013FF78
return 0;
}
code1.cpp, 简单继承:
#include <iostream>
using namespace std;
class A
{
public:
int x;
};
class B : public A
{
};
int main()
{
cout << sizeof(A) << endl; // 4
cout << sizeof(B) << endl; // 4
A a;
printf("%p\n", &a.x); // 0013FF7C
printf("%p\n", &a.A::x); // 0013FF7C
B b;
printf("%p\n", &b.x); // 0013FF78
printf("%p\n", &b.B::x); // 0013FF78
printf("%p\n", &b.A::x); // 0013FF78
return 0;
}
code2.cpp继承
#include <iostream>
using namespace std;
class A
{
public:
int x;
};
class B : public A
{
public:
int x;
};
int main()
{
cout << sizeof(A) << endl; // 4
cout << sizeof(B) << endl; // 8
A a;
printf("%p\n", &a.x); // 0013FF7C
printf("%p\n", &a.A::x); // 0013FF7C
B b;
printf("%p\n", &b.x); // 0013FF78
printf("%p\n", &b.B::x); // 0013FF78
printf("%p\n", &b.A::x); // 0013FF74 //可见, B自己有两份x
return 0;
}
code3.cpp, 将code2.cpp改为无继承等价形式:
#include <iostream>
using namespace std;
class A
{
public:
int x;
};
class B
{
public:
int AAAx;
int x;
};
int main()
{
cout << sizeof(A) << endl; // 4
cout << sizeof(B) << endl; // 8
A a;
printf("%p\n", &a.x); // 0013FF7C
printf("%p\n", &a.A::x); // 0013FF7C
B b;
printf("%p\n", &b.x); // 0013FF78
printf("%p\n", &b.B::x); // 0013FF78
printf("%p\n", &b.AAAx); // 0013FF74 //可见, code2.cpp中的成员变量继承的效果实际上类似于直接拷贝代码
return 0;
}
code4.cpp, 看看无继承的函数
#include <iostream>
using namespace std;
class A
{
public:
void test(){}
};
class B
{
public:
void test(){}
};
int main()
{
cout << sizeof(A) << endl; // 1
cout << sizeof(B) << endl; // 1
A a;
printf("%p\n", a.test); // 00401131
printf("%p\n", a.A::test); // 00401131
B b;
printf("%p\n", b.test); // 004010D7
printf("%p\n", b.B::test); // 004010D7
return 0;
}
code5.cpp 看看函数继承:
#include <iostream>
using namespace std;
class A
{
public:
void test(){}
};
class B : public A
{
};
int main()
{
cout << sizeof(A) << endl; // 1
cout << sizeof(B) << endl; // 1
A a;
printf("%p\n", a.test); // 0040112C
printf("%p\n", a.A::test); // 0040112C
B b;
printf("%p\n", b.test); // 0040112C
printf("%p\n", b.B::test); // 0040112C
printf("%p\n", b.A::test); // 0040112C
return 0;
}
code6.cpp函数继承
#include <iostream>
using namespace std;
class A
{
public:
void test(){}
};
class B : public A
{
public:
void test(){}
};
int main()
{
cout << sizeof(A) << endl; // 1
cout << sizeof(B) << endl; // 1
A a;
printf("%p\n", a.test); // 00401131
printf("%p\n", a.A::test); // 00401131
B b;
printf("%p\n", b.test); // 004010D7
printf("%p\n", b.B::test); // 004010D7
printf("%p\n", b.A::test); // 00401131 //这里居然是00401131, 要理解
return 0;
}
可见, 在继承中, 成员变量的继承类似于“拷贝”, 成员函数的继承类似于“共用”。