您的位置:首页 > 编程语言 > C语言/C++

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;
}

通过上述简单代码的测试,验证了作者说这句话的意图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: