复制、移动、交换、赋值和析构函数的 C++ 继承?我需要哪个

Hoo*_*och 1 c++ inheritance

假设我有两个班级

Base 管理一些内存。它具有工作移动、交换、赋值和析构函数。Derived 不会添加任何需要管理的新内容(没有新的内存分配)。

class Base
{
public:
    Base();
    Base(const Base& other);
    friend void swap(Base& a, Base& b);
    Base(Base&& other);

protected:
    int** some2Darray;
    int w, h;
};

class Derived : public Base
{
public:
    Derived();
    //...?
};
Run Code Online (Sandbox Code Playgroud)

我是否需要在派生类中实现所有这些函数才能使它更好?如何重用基类中的这些函数?我不需要在这个类中管理更多的内存。

如果我将成员添加到派生类,这些函数会是什么样子?我应该完全重写所有这些函数,还是有某种方法可以使用例如“复制”基类,然后在复制构造函数中另外复制一个添加的成员?

luk*_*k32 5

您可以继承(编辑:是的,这不是真正的继承,也许应该明确指出)自c++11. 通过

class Derived : public Base
{
public:
    Derived();
    using Base::Base; // <-- this will import constructors
};
Run Code Online (Sandbox Code Playgroud)

但这不会照顾任何额外的东西!

但是,您不需要复制代码。您可以只调用父函数。

例如:

class Derived : public Base
{
   int extra;
public:
   Derived() : Base(), extra(42){};
   Derived(const Derived& other) : Base(other) {extra = other.extra;};
   void copy(const Derived& other);
   friend void swap(Derived& a, Derived& b);
};

void Derived::copy(const Derived& other){
   Base::copy(other);
   extra = other.extra;
}
Run Code Online (Sandbox Code Playgroud)

也不要忘记虚拟析构函数。

编辑:对于交换,我只是将派生实例转换为它们的基础,以使编译器使用为父类型定义的交换。然后交换额外的东西。

void swap(Derived& a, Derived& b){
    swap(static_cast<Base&>(a), static_cast<Base&>(b));
    swap(a.extra, b.extra);
}
Run Code Online (Sandbox Code Playgroud)