effective C++ STL 第三条:确保容器中的对象副本正确而高效

    在这一条中,有这么几句话“ ‘剥离’问题意味着向基类对象的容器中插入派生类的对象几乎总是错误的。”、“使复制动作高效、正确,病防治剥离问题发生的一个简单办法是使容器包含指针,而不是对象。”、“复制指针的速度非常快,并且总是按照你期望的方式进行,而且当它被复制时不会有任何剥离现象发生。”

    如何理解这几句话?看到这就话我想到的两个问题是:容器中存储的对象复制给基类的指针然后调用基类的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 C++ STL 第三条:确保容器中的对象副本正确而高效)