effective C++ STL 第三条:确保容器中的对象副本正确而高效
2014-12-15 11:21
309 查看
在这一条中,有这么几句话“ ‘剥离’问题意味着向基类对象的容器中插入派生类的对象几乎总是错误的。”、“使复制动作高效、正确,病防治剥离问题发生的一个简单办法是使容器包含指针,而不是对象。”、“复制指针的速度非常快,并且总是按照你期望的方式进行,而且当它被复制时不会有任何剥离现象发生。”
如何理解这几句话?看到这就话我想到的两个问题是:容器中存储的对象复制给基类的指针然后调用基类的show函数应该可以输出父类中增加的元素,这么说来隐含了一个虚函数(show函数应该声明为virtual);假如我存储的不是指针,但是通过子类的指针调用会发生什么?
#include<iostream>
#include<string>
#include <vector>
using namespace std;
class base
{
private:
int number;
string name;
public:
base()
{
}
base(int avg1,string avg2):number(avg1),name(avg2)
{
}
void virtual show()
{
cout <<number<<'\t'<<name<<endl;
}
};
class derived:public base
{
private:
int number;
string name;
string hobit;
public:
string gethobit()
{
return hobit;
}
derived()
{
}
derived(int avg1,string avg2,string avg3):base(avg1,avg2)
{
number=avg1;
name=avg2;
hobit=avg3;
}
void show()
{
cout<<number<<'\t'<<name<<'\t'<<hobit<<endl;
}
};
int main()
{
vector<base*> vw;
derived pp(1,"hehe","qiuqiu");
vw.push_back(&pp);
base*temp = vw.front();
temp->show();
/* -------------------------------*/
/* 以下代码发生了“剥离”:子类中不是从父类继承下来的被删除
// 这段代码测试的结果很显然是无法输出子类增加的元素的
vector<base> vw;
derived pp(1,"hehe","qiuqiu");
vw.push_back(pp);
base temp = vw.front();
temp.show();
*/
/* 以下代码发生了“剥离”:子类中不是从父类继承下来的被删除
//这段代码及时我们使用了基类的指针调用一个虚函数,还是看不到子类增加的数据
vector<base> vw1;
vw1.push_back(pp);
base *temp2 = &(vw1.front());
temp2->show();
*/
return 0;
}
通过上述简单代码的测试,验证了作者说这句话的意图。
如何理解这几句话?看到这就话我想到的两个问题是:容器中存储的对象复制给基类的指针然后调用基类的show函数应该可以输出父类中增加的元素,这么说来隐含了一个虚函数(show函数应该声明为virtual);假如我存储的不是指针,但是通过子类的指针调用会发生什么?
#include<iostream>
#include<string>
#include <vector>
using namespace std;
class base
{
private:
int number;
string name;
public:
base()
{
}
base(int avg1,string avg2):number(avg1),name(avg2)
{
}
void virtual show()
{
cout <<number<<'\t'<<name<<endl;
}
};
class derived:public base
{
private:
int number;
string name;
string hobit;
public:
string gethobit()
{
return hobit;
}
derived()
{
}
derived(int avg1,string avg2,string avg3):base(avg1,avg2)
{
number=avg1;
name=avg2;
hobit=avg3;
}
void show()
{
cout<<number<<'\t'<<name<<'\t'<<hobit<<endl;
}
};
int main()
{
vector<base*> vw;
derived pp(1,"hehe","qiuqiu");
vw.push_back(&pp);
base*temp = vw.front();
temp->show();
/* -------------------------------*/
/* 以下代码发生了“剥离”:子类中不是从父类继承下来的被删除
// 这段代码测试的结果很显然是无法输出子类增加的元素的
vector<base> vw;
derived pp(1,"hehe","qiuqiu");
vw.push_back(pp);
base temp = vw.front();
temp.show();
*/
/* 以下代码发生了“剥离”:子类中不是从父类继承下来的被删除
//这段代码及时我们使用了基类的指针调用一个虚函数,还是看不到子类增加的数据
vector<base> vw1;
vw1.push_back(pp);
base *temp2 = &(vw1.front());
temp2->show();
*/
return 0;
}
通过上述简单代码的测试,验证了作者说这句话的意图。
相关文章推荐
- effective stl:确保容器中对象副本正确而高效
- 第3条:确保容器中的对象拷贝正确而高效
- 《Effective STL》 03 确保容器中的对象拷贝正确而高效
- 从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法
- C++ 之高效使用STL (STL 容器的选择)
- C++ 之高效使用STL (STL 容器的选择)
- C++ 之高效使用STL (STL 容器的选择)
- Ineffective C++(1):STL容器不仅仅可以保存指针
- 从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法
- C++之模板类(Template) 容器之map 及 对象副本 深/浅拷贝 等问题
- C++模板类 容器之map 及 对象副本 深/浅拷贝 等问题
- C++之STL(八):函数对象、 函数对象与容器、函数对象与算法
- 读书笔记 effective c++ Item 4 确保对象被使用前进行初始化
- Effective STL-各种容器正确删除元素方法
- C++ STL 如何安全的将一个含有指针变量的类对象放在容器中? 避免浅拷贝问题
- C++模板类 容器之map及对象副本 深/浅拷贝等问题浅析
- 从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法
- C++之模板类(Template) 容器之map 及 对象副本 深/浅拷贝 等问题
- 对象容器Effective STL——容器中所发生的对象拷贝问题
- C++ STL基本容器比较