如何使用C ++中的相同实现正确表达两个派生类函数?

Mat*_*eek 7 c++ inheritance

当前,我处于一些基类和许多子类的情况。子类必须重写多个虚拟方法,但是,有时一个子类中虚拟方法的实现与另一子类完全相同。我应该只复制实现代码并将其粘贴到另一个子类中,还是可以同时表达两个子类的实现?

下面的代码演示了我的问题。

class A
{
    virtual void foo1() = 0;
    virtual void foo2() = 0;
};

class B : public A
{
    void foo1();
    void foo2();
};

class C : public A
{
    void foo1();
    void foo2();
};

class D : public A
{
    void foo1();
    void foo2();
};

void B::foo1()
{
     // Same implementation of foo1 as C
}

void C::foo1()
{
     // Same implementation of foo1 as B
}

void D::foo1()
{
     // Different implementation of foo1
}

void B::foo2()
{
     // Different implementation of foo2
}

void C::foo2()
{
     // Different implementation of foo2
}

void D::foo2()
{
     // Different implementation of foo2
}
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式结合B和C的实现吗?

注意:我明确写出了foo2,因为否则B和C子类在每种方式上都是相同的。

我想知道当有许多子类(比这个玩具示例大得多)并且它们继承了许多虚函数且某些虚函数具有相同实现的情况。换句话说,每当一个函数同时具有相同的实现时创建一个子类的情况将使整个继承结构混乱。

Rad*_*ski 12

添加一个中间代理类:

class BC : public A {
    void foo1();
};

class B : public BC {
    void foo2();
};

class C : public BC {
    void foo2();
};
Run Code Online (Sandbox Code Playgroud)

正如@Fureeish提到的-不要重复自己。

如果大量的类/函数,该怎么办:

照着做。在最坏的情况下,您将以(大约)相同数量的代码结尾,使用更多的类,但使用更少的函数。即便如此,这也是一个净赢,因为您已经删除了许多代码冗余,并且尽管继承结构更糟,但是代码质量却好得多。实际上,这种密集的“冲突矩阵”表明类本身存在问题。也许您应该首先编写那些最终创建的中间类?在所有情况下,减少代码冗余都是一个巨大的胜利。

  • 答案很好,但不是代理类。只是B和C的中间通用基础。 (2认同)