调用子级的纯虚方法实现的抽象父类(C ++)

时间:2019-03-15 12:01:16

标签: c++ inheritance design-patterns pure-virtual

让我解释一下这个令人困惑的标题。

问题是关于抽象基类和纯虚方法(实现)。到目前为止,我知道:

  • 如果一个类至少包含一个纯virtual方法(可以Base中有一个实现),则该类是抽象的。通常会创建此类protected的构造函数。
  • Child : Base类必须实现所有纯virtual方法才能实例化。

我试图构建一个抽象基类,该基类通过其方法和纯虚方法的设计来定义一个特定的过程(该过程在其基本例程中永远不会改变),其中一部分会根据子类的实现而改变。我希望实现一种类似于以下的设计:

class Base {
protected:
    Base() {
        setup();
    }
    virtual ~Base() {}
    void setup() {
        //do stuff that will always be the same
        setupDetails();
    }
    virtual void setupDetails() = 0;
    void mainProcess() {
        //do stuff that will always be the same
        processDetails();
    }
    void processDetails() = 0;
};
inline void Base::setupDetails() {} //(**)
inline void Base::processDetails() {}


class Child : public Base {
private:
    Child() : Base() {}
    virtual ~Child() {}
    void setupDetails() {//do child stuff}
    void processDetails() {//do child stuff}
};

在我的具体应用案例中,Base是一些“ Quiz”类,它提供gui和在特定时间间隔等内提问的机制。Child类提供了实际的问题/答案等

所提供的设计(至少在我看来是幼稚的)将迫使子类执行某些过程步骤,否则这些步骤将不会更改。但是,此概念不起作用,因为Base中的“正在调用纯虚函数”。

  • 我将不得不采用另一种方法:让子类使用基类方法构建过程(我不想要!)
  • 或者通过 not xxxDetails()方法标记为纯净,而仅将virtual标记为纯,从而使基类成为非抽象。

但是:尽管Base不能调用Child的方法似乎很合理,但我仍然想知道... Base知道必须实例化Child才能实现其纯虚拟功能!并且Base仅在存在这样的Child时才实例化,这意味着确实存在实现。有什么问题?我该如何获得所需的设计? (*)

还是仅由于Base的构造函数中存在这样一个纯虚方法调用而引起问题,因为“第一个孩子”本身也可能是抽象的?

(*)也许我对这个问题的整体看法存在很大缺陷,请赐教,然后...

(**)这些空的实现防止了“纯方法调用”错误(?),但当然会调用父方法,而不是子方法。

0 个答案:

没有答案