对象切片
2013-11-30 13:19
134 查看
当多态的处理对象时,传地址与传值有明显不同,如果使用对象而不是地址或引用进行向上映射,对象会被“切片”
如程序:
#include <iostream>
using namespace std;
class base
{
int i;
public:
base(int I = 0) : i(I){}
virtual int sum() const {return i;}
};
class derived : public base
{
int j;
public:
derived(int I = 0, int J = 0) : base(I), j(J){}
int sum() const
{
return base::sum() + j;
}
};
void call(base b)
{
cout << "sum = " << b.sum() << endl;
}
int main()
{
base b(10);
derived d(10, 17);
call(b);
call(d);
system("pause");
return 1;
}
1. call()接受的只是一个base对象,对call的任何调用都将引起一个与base大小相同的对象压栈并在调用后清除
2. 如果一个base的派生类对象传给call,编译器接受他,但只拷贝这个对象对应于base的部分,切除这个对象的派生类部分
如程序:
#include <iostream>
using namespace std;
class base
{
int i;
public:
base(int I = 0) : i(I){}
virtual int sum() const {return i;}
};
class derived : public base
{
int j;
public:
derived(int I = 0, int J = 0) : base(I), j(J){}
int sum() const
{
return base::sum() + j;
}
};
void call(base b)
{
cout << "sum = " << b.sum() << endl;
}
int main()
{
base b(10);
derived d(10, 17);
call(b);
call(d);
system("pause");
return 1;
}
1. call()接受的只是一个base对象,对call的任何调用都将引起一个与base大小相同的对象压栈并在调用后清除
2. 如果一个base的派生类对象传给call,编译器接受他,但只拷贝这个对象对应于base的部分,切除这个对象的派生类部分
相关文章推荐
- 关于对象切片与多态性的认识
- Golang 接口切片存储多层嵌套Map对象,如何初始化,又如何直接读取嵌套层的key-value值
- 对象切片
- 对象切片与虚函数机制
- 对象切片 Object Slicing
- [集成IronPython] 使CLR对象对动态语言更友好(二)—— 支持切片
- C++多态必须使用指针或者引用,直接传对象就变成切片
- C++对象切片
- 多态性与虚函数之对象切片
- c++对象切片
- 廖雪峰Python教程1轮还没学明白的(2) -- 面向对象高级编程 -- 定制类 -- 实现Fib数列的__getitem__()/切片方法
- Golang 如何将多个对象添加到切片里的不同方式,空切片的不同定义方式
- 什么是对象切片(Object Slicing)?
- C++对象切片和对象切片的阻止(纯虚函数让编译器强迫程序猿修改有对象切片的代码)
- 由vector造成的对象切片问题
- 详解Python中的__getitem__方法与slice对象的切片操作
- 详解Python中的__getitem__方法与slice对象的切片操作
- 提防对象切片
- C++:对象切片及拷贝构造函数
- c++对象切片