假设我有两个班级
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)
我是否需要在派生类中实现所有这些函数才能使它更好?如何重用基类中的这些函数?我不需要在这个类中管理更多的内存。
如果我将成员添加到派生类,这些函数会是什么样子?我应该完全重写所有这些函数,还是有某种方法可以使用例如“复制”基类,然后在复制构造函数中另外复制一个添加的成员?
您可以继承(编辑:是的,这不是真正的继承,也许应该明确指出)自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)