gpt4 book ai didi

c++ - 有没有一种方法可以复制派生类指针的 vector 而不将其强制转换为基类?

转载 作者:行者123 更新时间:2023-11-28 01:14:12 25 4
gpt4 key购买 nike

我有 4 个类:1 个 Base、2 个 Derived 和 1 个 Container 类。Container 类包含一个 Base 指针 vector 。

我想为我的类 Container 创建一个复制构造函数,它不会将 Derived 指针转换为 Base,这样我之后可以将 Base 指针转换为 Derived 指针。

class Base {
int m_base_attribute;
public:
Base() : m_base_attribute(420) {}

virtual void say_hello() {
std::cout << "Hello !" << std::endl;
}
};

class Derived : public Base {
int m_derived_attribute;
public:
Derived() : Base(), m_derived_attribute(69) {}

virtual void say_hello() {
std::cout << "I'm a derived class !" << std::endl;
}
};

class Container {
std::vector<Base*> m_base_vector;
public:
Container() {
m_base_vector.push_back(new Derived());
}

Container(const Container& model) {
for(auto base : model.m_base_vector){
m_base_vector.push_back(new Base(*base));
}
}

~Container() {
for(auto base : m_base_vector) {
delete base;
}
}
};

有没有办法在没有任何内存泄漏的情况下做到这一点?

最佳答案

问题是 new Base(*base) 总是创建一个 Base 对象,而不是 Derived 对象。这叫做 slicing .解决方法是使用虚拟 clone 函数和虚拟析构函数:

class Base {
int m_base_attribute;
public:
// ...
virtual std::unique_ptr<Base> clone() const
{
return std::make_unique<Base>(*this);
}
virtual ~Base() {}
};

class Derived : public Base {
int m_derived_attribute;
public:
// ...
std::unique_ptr<Base> clone() const override
{
return std::make_unique<Derived>(*this);
}
};

请注意,我使用 std::unique_ptr 而不是原始指针来避免内存泄漏。现在您可以实现 Container 类而无需切片:

class Container {
std::vector<std::unique_ptr<Base>> m_base_vector;
public:
// ...
Container(const Container& model)
{
m_base_vector.reserve(model.m_base_vector.size());
for (const auto& p : m_base_vector) {
m_base_vector.push_back(p->clone());
}
}
};

关于c++ - 有没有一种方法可以复制派生类指针的 vector 而不将其强制转换为基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59234818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com