如何获得继承已知类的未知类的副本
How to achieve a copy of an unknown Class which inherits a known class
我需要一个不同类实例的数组(这里:B),它们都共享相同的基类(这里:A)。
实例应该作为指针存储,因为它们在其他地方被引用(这里没有显示)。
我试着这样做:
class A {
public:
A() {}
};
class B : public A {
int m_magicValue;
public:
B() : A() , m_magicValue(4711){}
int getMagicValue() { return m_magicValue; }
};
class Manager {
std::vector<A*> m_array;
public:
Manager() {}
virtual ~Manager() {
for( size_t i=0; i<m_array.size(); i++ )
delete m_array[i];
m_array.clear();
}
void addA( const A& a ) {
// here A is copied - here the problem occurs
m_array.push_back( new A(a) );
// createSomeReferences( m_array.back() );
}
A& getA( size_t idx ) {
return *m_array[idx];
}
};
int main() {
B b;
Manager manager;
manager.addA(b);
B& copiedB = (B&) manager.getA(0);
int magic = copiedB.getMagicValue(); // magic is some random stuff instead of 4711!
return 0;
}
Manager不知道任何关于B类的事情,它只知道a类。
在addA()中发生了一件有趣的事情:这里它试图复制B并在数组中存储一个指针。
但正如预期的那样,它并不像预期的那样工作;-)copiedB.getMagicValue ();返回一个随机值。
原因比较清楚:使用A的复制构造函数而不是B的复制构造函数,因此只复制A的部分。
现在我的问题是:有没有一种好方法来实现这样的复制,它继承了整个类的层次结构,即使只有基类是已知的?
您需要一个虚拟的"克隆"函数(有时通俗地称为"虚拟复制构造函数"):
struct A
{
virtual ~A() { }
virtual A * clone() const = 0;
};
struct B : A
{
virtual A * clone() const
{
return new B(*this);
}
};
用法:
void addA(A const & a)
{
insert(a.clone());
}
使用原始指针是非常愚蠢的,但是,最好让克隆函数以及容器在std::unique_ptr<A>
上键入(代码在其他方面几乎相同)。
(你现在可能会问自己,"为什么没有一个版本的unique_ptr
已经做了深度,虚拟克隆,也许叫value_ptr<A>
?这个问题问得好
相关文章:
- 继承期间显示未知行为的子类
- 输入中的字符串数未知(以字母表示)
- 具有未知值时的时间复杂性
- 用callgrind追踪不必要的副本
- 链表中写入访问冲突的未知原因
- 正在生成未知类实例
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 读取文件时运行时的未知行为
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 检查注册表项是否链接到(或副本)另一个注册表项
- 初始化多个未知基类
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- C++基于范围的 for 循环和元素副本
- 如何存储未知次数迭代的输入?
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 编译 Boost 时在 OS X 上的"ld:未知选项:-soname"
- 如何获得继承已知类的未知类的副本