#include <iostream>
#include <vector>
#include <memory>
class Base{
public:
Base(int age)
{
m_age = age;
}
Base& operator=(const Base &b)
{
m_age = b.m_age;
}
virtual void show_data() const
{
std::cout<<"Base:"<<m_age<<std::endl;
}
int m_age;
};
class Dervied : public Base{
public:
Dervied(const std::string& name, const int age):m_name(name), Base(age){}
void show_data() const override
{
std::cout<<"Devied:"<<m_name<<std::endl;
}
std::string m_name;
};
void test()
{
std::vector<Base> baseContainer;
Dervied d("zhangsan", 20);
/*若将Dervied对象插入到容器中,会导致派生类对象特有部分在拷贝时数据丢失
产生剥离问题(向基类对象容器中插入派生类对象几乎总是错误的,如果希望插入后对象
任然像派生类对象一样,比如调用派生类虚函数,则应该拷贝派生类指针,父类容器中存放的
时父类对象指针)
*/
baseContainer.push_back(d); // 不要拷贝派生类对象
baseContainer[0].show_data();
std::vector<Base*> basePtrContainer;// 最好使用智能指针
basePtrContainer.push_back(&d); // 拷贝派生类指针
// 类中定义对象容器一般使用vector和shared_ptr进行结合,防止内存泄漏问题
typedef std::shared_ptr<Base> baseSharedPtr;
typedef std::vector<baseSharedPtr> baseSharedPtrContainer;
baseSharedPtrContainer vec;
auto son = std::make_shared<Dervied>("zhangsan", 20);
vec.push_back(son);
vec[0]->show_data();
}
int main()
{
test();
return 0;
}
STL不要将派生类对象拷贝给父类
最新推荐文章于 2025-01-18 11:31:52 发布