如何轻松替换Base类

时间:2010-05-08 15:36:14

标签: c++ class oop abstract-class

我有以下类的层次结构

class classOne
{
    virtual void abstractMethod() = 0;
};

class classTwo : public classOne
{
};

class classThree : public classTwo
{
};  

所有classOne,classTwo和classThree都是抽象类,我有另一个定义纯虚方法的类

class classNonAbstract : public classThree
{
    void abstractMethod();

    // Couple of new methods
    void doIt();
    void doItToo();
};

现在我需要不同的......我需要它像

class classNonAbstractOne : public classOne
{
    void abstractMethod();

    // Couple of new methods
    void doIt();
    void doItToo();
};

class classNonAbstractTwo : public classTwo
{
    void abstractMethod();

    // Couple of new methods
    void doIt();
    void doItToo();
};

class classNonAbstractThree : public classThree
{
    void abstractMethod();

    // Couple of new methods
    void doIt();
    void doItToo();
};

但是所有的非抽象类都有相同的新方法,使用相同的代码......我希望避免将所有方法及其代码复制到每个非抽象类中。我怎么能做到这一点?

希望这是可以理解的......

2 个答案:

答案 0 :(得分:4)

template<class Base>
struct Concrete : Base {
  void abstractMethod();

  void doIt() {
    // example of accessing inherited members:
    int n = Base::data_member; // or this->data_member
    n = Base::method(); // non-virtual dispatch
    n = this->method(); // virtual dispatch

    // since Base is a template parameter, 'data_member' and 'method' are
    // dependent names and using them unqualified will not properly find
    // them
  }
  void doItToo();
};

typedef Concrete<classOne> classNonAbstractOne; // if desired, for convenience

确保为您的抽象基类提供虚拟公共析构函数或使析构函数受到保护(然后它不必是虚拟的,但仍然可以)。

因为必须使用查找的名称解析模板而不确切知道 Base 将是什么,所以您需要使用Base::memberthis->member来访问继承的成员。

答案 1 :(得分:1)

我通常尽可能避免继承(除了定义纯接口的纯抽象类),因为它会创建紧耦合。在许多情况下,成分是更好的选择。

此外,复杂的继承结构会使事情变得混乱。从你的描述中说出在这种特殊情况下最好的是什么并不容易。只是指出这是一条经验法则。