设计思路
- 深拷贝:对于动态分配的资源,需要进行深拷贝,确保每个对象都有自己独立的资源副本,避免浅拷贝导致的资源共享和释放问题。
- 虚函数与多态:通过在基类中定义虚的拷贝构造函数,利用多态性确保在派生类对象拷贝时调用正确的拷贝构造函数,防止对象切片。
- 性能优化:在拷贝构造函数中,可以采用移动语义(C++11 及以后)来提高性能,避免不必要的资源重新分配。
示例代码
#include <iostream>
#include <memory>
class Base {
public:
virtual ~Base() = default;
virtual std::unique_ptr<Base> clone() const = 0;
virtual void print() const = 0;
};
class Derived1 : public Base {
private:
std::unique_ptr<int> data;
public:
Derived1(int value) : data(std::make_unique<int>(value)) {}
~Derived1() override = default;
std::unique_ptr<Base> clone() const override {
return std::make_unique<Derived1>(*data);
}
void print() const override {
std::cout << "Derived1: " << *data << std::endl;
}
};
class Derived2 : public Base {
private:
std::unique_ptr<int> data;
public:
Derived2(int value) : data(std::make_unique<int>(value)) {}
~Derived2() override = default;
std::unique_ptr<Base> clone() const override {
return std::make_unique<Derived2>(*data);
}
void print() const override {
std::cout << "Derived2: " << *data << std::endl;
}
};
void copyAndPrint(const Base& obj) {
auto clonedObj = obj.clone();
clonedObj->print();
}
int main() {
Derived1 d1(10);
Derived2 d2(20);
copyAndPrint(d1);
copyAndPrint(d2);
return 0;
}
性能优势分析
- 避免对象切片:通过虚函数
clone
,在拷贝对象时能够准确调用派生类的拷贝构造函数,避免了对象切片问题,确保拷贝后的对象类型与原对象一致。
- 资源管理:使用
std::unique_ptr
进行资源管理,自动释放资源,减少了内存泄漏的风险。并且在 clone
函数中利用 std::make_unique
高效地创建新对象,提升性能。
- 移动语义:虽然示例中未直接体现移动语义,但在实际场景中,可以在
clone
函数返回时使用 std::move
来转移资源所有权,进一步优化性能,避免不必要的资源复制。