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

时间:2011-01-27 20:41:03

标签: 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";
    }
};

在这种情况下,在definedInVirtual()DerivedA上调用DerivedB,通过交叉授权调用definedInVirtual()Virtual的定义。这是一种代码重用形式。

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

修改

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

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

在我写这个答案的时候,你的问题有一些未定义和非常罕见的术语,“交叉授权”和“超级代理”(在C ++中没有意义),你的课程没有意义:什么是虚拟继承?

所以,我很抱歉,但到目前为止唯一能说的就是避免所提出的代码中的不良内容:

  • 不要让纯值产生方法不是const,请添加const
  • DeadMG在他的回答中指出,避免虚拟继承通常是一个好主意。

在你的情况下,至少你已经在这一点上展示了什么,虚拟继承根本不用于任何事情(关于“交叉授权”的评论可能是它,但它没有意义),这很简单:删除virtual关键字:它在这里没有任何用处。

您可以尝试使用更相关的示例修改您的问题,而不使用流行语。

(理想情况下,这应该是一个评论,但对于SO评论来说太长了。哎呀,消极性。不完全快乐 - 快乐或伪技术正面!现在匿名的驱逐者可能会受到驱动,受到启发“天气预报员”。好吧。)

干杯&第h。,