我有一个带有两个继承类的抽象基类。在这两个类中,我定义了构造函数使用的虚方法。现在我需要创建一个复制构造函数,但我不能将复制构造函数声明为虚拟,但我希望其中的方法调用依赖于作为参数提供的对象类型。我怎么解决这个问题?
现在我使用基类来定义参数的类型,这不起作用,因为我在复制构造函数中调用的方法没有在基类中定义。
基本上我需要复制构造函数是虚拟的。
答案 0 :(得分:6)
答案 1 :(得分:3)
在T类的复制构造函数中,您知道要复制的对象是T类。
复制构造函数无法构造派生类的对象。
它是构造派生部分的派生类'复制构造函数。
所以你对某些事情感到困惑:这个问题没有意义。
提出一个例子可能会清楚到底是什么混淆。
干杯&第h。,
答案 2 :(得分:1)
在构造函数/析构函数期间调用的虚函数将不会解析为派生类型。 正如Scott Myers所说 here -
During base class construction, virtual functions never go down into derived classes. Instead, the object behaves as if it were of the base type.
因为在构造期间不能使用虚函数从基类调用,所以可以通过让派生类将必要的构造信息传递给基类构造函数来进行补偿。
答案 3 :(得分:0)
在对象中创建一个虚方法,该方法作为参数传递给复制构造函数,并从复制构造函数中调用它。如有必要,将'this'传递给该方法。
答案 4 :(得分:0)
我们必须确切地知道您想要了解的是什么是正确的解决方案。
然而,在被复制的对象上调用虚函数没有问题,因为它已经是一个完全构造的对象。您也可以将“this”提供给它,只要该函数知道传入的指针尚未完全构造。因此:
T::T( const T & other )
{
other.some_virtual_method(this); // legal but potentially dangerous
}
void T::some_virtual_method( T* other ) const
{
other->another_virtual_method(); // dangerous in this situation
}
答案 5 :(得分:0)
对原型模式here进行了很好的讨论,这可能会有所帮助。
原型[Go4]
问题
“工厂”课程无法预料到 它必须是“产品”对象的类型 创建
解决方案
从中获取所有产品类 抽象产品基类 声明一个纯虚拟克隆() 方法。产品基类也 作为产品工厂的功能 提供静态工厂方法 叫做makeProduct()。这个功能 使用类型描述参数 在静态中找到原型 由原型表维护 产品基类。原型 克隆本身,克隆是 回到了打电话。
“Go4”的引用是由“四人帮”作者撰写的seminal book on Design Patterns。