通过继承和交叉委派重用代码

J. *_*fer 1 c++ code-reuse

假设我在C++中有以下类层次结构:

class AbstractBaseClass
{
public:
    // Note:  Class is completely abstract! No data!
    AbstractBaseClass() {}
    virtual ~AbstractBaseClass() {}
    virtual std::string definedInVirtual() = 0;
    virtual std::string definedInDerived() = 0;
};

class Virtual : public virtual AbstractBaseClass
{
public:
    Virtual() {}
    virtual ~Virtual() {}

    std::string definedInVirtual()
    {
        return "definedInVirtual";
    }
};

class DerivedA : public Virtual
{
public:
    DerivedA() {}
    virtual ~DerivedA() {}

    std::string definedInDerived()
    {
        return "definedInDerivedA";
    }
};

class DerivedB : public Virtual
{
public:
    DerivedB() {}
    virtual ~DerivedB() {}

    std::string definedInDerived()
    {
        return "definedInDerivedB";
    }
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,要求definedInVirtual()在任DerivedA或者DerivedB,定义definedInVirtual()Virtual被调用,通过交叉授权.这是一种代码重用的形式.

这种方法有什么缺点?在这种情况下,有没有更好的方法来实现代码重用?

编辑:

我问的主要原因是有一个非常庞大的类,有人通过继承来编写代码重用计划(他后悔这样做,但是类很大),由于添加了一个新的ABC而被超级分类装饰器从新ABC派生到对象层次结构.我需要向新的ABC添加需要由DerivedA和DerivedB处理的方法,以及装饰器通过调用ABC的内部实例来处理.我的想法是使用上述技术......

Pup*_*ppy 5

代码重用应该通过组合而不是继承来实现.虚拟继承很慢且非常混乱,几乎所有设计都应该避免.

  • +1。还要考虑到多重继承将减慢对除第一个基类之外的所有基类的调度(通过 vtable 的调度必须转到重写“this”指针以使其适应最终重写器类型的 thunk)...继承与代码有关重用,但方向相反:您继承,以便所有已经可以处理您的基础的现有代码都将适用于您的新行为。不是这样你可以使用基类中的代码......这可以通过其他方式实现。 (2认同)