鉴于由派生类的继承过多基类,这需要您通过基类指针,每个实体管理这些程序结构.当只知道基类指针时,是否有一种简单的方法来复制整个派生对象?
环顾四周似乎可能(如果非常繁琐)使用dynamic_cast调用来检查基类指针是否可以作为适当的派生类进行转换,然后使用派生类的复制构造函数复制它.然而,这并不是一个真正的最佳解决方案,部分原因是由于过度使用了dynamic_cast,而且它会让人感到头疼,难以维持和扩展.
我遇到的另一个更优雅的解决方案如下:
class Base
{
public:
Base(const Base& other);
virtual Base* getCopy();
...
}
class Derived :public Base
{
Derived(const Derived& other);
virtual Base* getCopy();
...
}
Base* Base::getCopy()
{
return new Base(*this));
}
Base* Derived::getCopy()
{
return static_cast<Base*>(new Derived(*this));
}
Run Code Online (Sandbox Code Playgroud)
然后通过调用getCopy()指向任何派生对象的Base类指针,仍然可以返回一个基类指针,但也复制了整个派生对象.这种方法感觉更易于维护,因为它只需要getCopy()在所有派生类中使用类似的函数,并且不需要针对所有可能的派生对象进行测试.
从本质上讲,这是明智的吗?或者有更好,更简洁的方式吗?
我试图理解移动构造函数。
我在类的构造函数中分配内存并在析构函数中销毁它。
当我尝试移动类时,我仍然有一个双空闲。
#include <algorithm>
class TestClass
{
public:
TestClass() {a_ = new int[1];}
TestClass(TestClass const& other) = delete;
TestClass(TestClass && other) noexcept // = default;
{
this->a_ = std::move(other.a_);
}
~TestClass() {delete[] a_;}
private:
int* a_ = nullptr;
};
int main( int argc, char** argv )
{
TestClass t;
TestClass t2 = std::move(t);
}
Run Code Online (Sandbox Code Playgroud)
为什么std::move不改为 nullptr other.a_?
如果移动构造函数是默认的,我也有同样的问题。
我发现了以下问题,但我仍然不知道为什么移动运算符不将源变量更改为默认值。