我眼中的C++继承初探
来源:互联网 发布:印刷图书排版软件 编辑:程序博客网 时间:2024/05/17 01:04
code0.cpp 热身一下C++, 无继承:
#include <iostream>using namespace std;class A{public:int x;};class B{public:int x;};int main(){cout << sizeof(A) << endl; // 4cout << sizeof(B) << endl; // 4A a;printf("%p\n", &a.x); // 0013FF7Cprintf("%p\n", &a.A::x); // 0013FF7CB b;printf("%p\n", &b.x); // 0013FF78printf("%p\n", &b.B::x); // 0013FF78return 0;}
code1.cpp, 简单继承:
#include <iostream>using namespace std;class A{public:int x;};class B : public A{};int main(){cout << sizeof(A) << endl; // 4cout << sizeof(B) << endl; // 4A a;printf("%p\n", &a.x); // 0013FF7Cprintf("%p\n", &a.A::x); // 0013FF7CB b;printf("%p\n", &b.x); // 0013FF78printf("%p\n", &b.B::x); // 0013FF78printf("%p\n", &b.A::x); // 0013FF78return 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; // 4cout << sizeof(B) << endl; // 8A a;printf("%p\n", &a.x); // 0013FF7Cprintf("%p\n", &a.A::x); // 0013FF7CB b;printf("%p\n", &b.x); // 0013FF78printf("%p\n", &b.B::x); // 0013FF78printf("%p\n", &b.A::x); // 0013FF74 //可见, B自己有两份xreturn 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; // 4cout << sizeof(B) << endl; // 8A a;printf("%p\n", &a.x); // 0013FF7Cprintf("%p\n", &a.A::x); // 0013FF7CB b;printf("%p\n", &b.x); // 0013FF78printf("%p\n", &b.B::x); // 0013FF78printf("%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; // 1cout << sizeof(B) << endl; // 1A a;printf("%p\n", a.test); // 00401131printf("%p\n", a.A::test); // 00401131B b;printf("%p\n", b.test); // 004010D7printf("%p\n", b.B::test); // 004010D7return 0;}
code5.cpp 看看函数继承:
#include <iostream>using namespace std;class A{public:void test(){}};class B : public A{};int main(){cout << sizeof(A) << endl; // 1cout << sizeof(B) << endl; // 1// 居然都是00401131, 要理解A a;printf("%p\n", a.test); // 0040112Cprintf("%p\n", a.A::test); // 0040112CB b;printf("%p\n", b.test); // 0040112Cprintf("%p\n", b.B::test); // 0040112Cprintf("%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; // 1cout << sizeof(B) << endl; // 1A a;printf("%p\n", a.test); // 00401131printf("%p\n", a.A::test); // 00401131B b;printf("%p\n", b.test); // 004010D7printf("%p\n", b.B::test); // 004010D7printf("%p\n", b.A::test); // 00401131 //这里居然是00401131, 要理解return 0;}
可见, 在继承中, 成员变量的继承类似于“拷贝”, 成员函数的继承类似于“共用”。
0 0
- 我眼中的C++继承初探
- 我眼中的C指针
- 我眼中的web2.0社区产品初探
- [我眼中的C#]复杂的数据类型
- [我眼中的C#]类的介绍
- C语言我眼中的指针
- C语言我眼中的指针
- C语言我眼中的指针
- [我眼中的C#]创建一个项目
- [我眼中的C#]流程控制语句
- [我眼中的C#]String和StringBuilder
- [我眼中的C#]正则表达式
- [我眼中的C#]多线程编程
- [我眼中的C#]网络编程
- [我眼中的C#]文件读写操作
- [我眼中的C#]XML和JSON
- [我眼中的C#]反射和特性
- 我眼中的指针
- mac memcache,xCode。启动memcache
- psftp用法
- HDU-4450-Draw Something (2012年金华赛区I题)
- HDU 2458Kindergarten(二分图 最大团点数)
- 细说Android BroadcastReceive
- 我眼中的C++继承初探
- Hibernate inverse
- IOS学习 UITouch基础学习
- Ubuntu“启动盘创建器”
- ZOJ Monthly, February 2012 C,D,F,H
- 文件名称对目标文件夹可能过长, 删除长文件夹中的文件
- 一次一密加密解密算法
- P2P下载工具
- c++和c语言中的函数相互调用的问题