C++对象切片和对象切片的阻止(纯虚函数让编译器强迫程序猿修改有对象切片的代码)
来源:互联网 发布:java 公平锁 编辑:程序博客网 时间:2024/05/16 08:49
下面, 我们来看一下C++中最简单的多态程序:
#include <iostream>using namespace std;class Animal{private:int weight;public:virtual void eat(){cout << "eat" << endl;}};class People : public Animal{private:string language;public:void eat(){cout << "chi huo" << endl;}};void fun(Animal *a){a->eat();}int main(){People me;fun(&me); // chi huoreturn 0;}这是指针形式的向上类型转换, 而我们又知道, 在C++中,引用是通过指针来实现的, 所以, 上面的代码也可以转换为等价的引用形式:
#include <iostream>using namespace std;class Animal{private:int weight;public:virtual void eat(){cout << "eat" << endl;}};class People : public Animal{private:string language;public:void eat(){cout << "chi huo" << endl;}};void fun(Animal &a){a.eat();}int main(){People me;fun(me); // chi huoreturn 0;}
好, 我们来看看非指针、引用形式的向上类型转换:
#include <iostream>using namespace std;class Animal{private:int weight;public:virtual void eat(){cout << "eat" << endl;}};class People : public Animal{private:string language;public:void eat(){cout << "chi huo" << endl;}};void fun(Animal a){a.eat();}int main(){People me;fun(me); // eatreturn 0;}可以看到, 程序的结果是eat, 而不是chi huo, 这又是为什么呢? 原来, 是对象被切片了, 被切割了。 当发生a=me;赋值操作的时候, 由于a和me的容量并不相同(a小me大), 所以a仅仅能容纳me的一部分, 对于编译器来说, 当发生a=me;后, 在fun内部, me的信息丢失了, 即me被切割了, 编译器的眼中全是Animal类型的a。 所以编译器丝毫感觉不到me的存在, a就是a了, 因此, 上面程序的结果自然就是eat.
上面的现象就是对象的切片, 实际上, 对象的切片容易让程序产生错误, 也无法实现预定的多态功能。 所以, 要避免对象切片, 那该怎么办呢? 不让Animal创建对象不就行了么, 对, 就是这样, 用纯虚函数来做。 让代码产生编译器错误, 强迫程序猿改正错误, 如下:
#include <iostream>using namespace std;class Animal{private:int weight;public:virtual void eat() = 0;};class People : public Animal{private:string language;public:void eat(){cout << "chi huo" << endl;}};void fun(Animal a) // error{a.eat();}int main(){People me;fun(me);return 0;}这样, 就有了编译错误, 从而强迫程序猿修改, 避免非指针、引用形式的向上类型转换 (对象切片)。
0 0
- C++对象切片和对象切片的阻止(纯虚函数让编译器强迫程序猿修改有对象切片的代码)
- 对象切片
- 对象切片
- C++:对象切片及拷贝构造函数
- C++:对象切片及拷贝构造函数
- 编写高质量代码——提防对象的切片
- 由vector造成的对象切片问题
- 关于对象切片与多态性的认识
- C++对象切片
- c++对象切片
- 提防对象切片
- 什么是对象切片(Object Slicing)?
- 什么是对象切片(Object Slicing)?
- 验证“切片是对原来的对象的一个引用”
- Python的“切片”:什么是切片?切片有什么作用?哪些地方会用到切片?
- Golang 如何将多个对象添加到切片里的不同方式,空切片的不同定义方式
- 切片
- 切片
- Hierarchical Clustering
- Java之旅——起航篇
- Mysql子查询和联合(UNION)查询详解
- 吃个饭呵呵好国家和国际化估计就
- 3.ios之NSBundle和plist的使用
- C++对象切片和对象切片的阻止(纯虚函数让编译器强迫程序猿修改有对象切片的代码)
- 梵蒂冈符合规范更换过好几个京沪高姐
- Outlier Detection
- C#发布Webservice到IIS
- 一切成功源于积累——20141223 美国三季度GDP大幅修正至5.0%,美指刷新八年半高位90.375 美日120.800
- Time Series Forecasting
- 在MAC OSX10.10上安装OpenCV2.4.10全过程(含Homwbrew,cmake安装,在XCode6.1.1上配置OpenCV2.4.10)
- 判断1000年----2000年的闰年
- Time Series Analysis