让我解释一下这个令人困惑的标题。
问题是关于抽象基类和纯虚方法(实现)。到目前为止,我知道:
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
中的“正在调用纯虚函数”。
xxxDetails()
方法标记为纯净,而仅将virtual
标记为纯,从而使基类成为非抽象。但是:尽管Base
不能调用Child
的方法似乎很合理,但我仍然想知道... Base
知道必须实例化Child
才能实现其纯虚拟功能!并且Base
仅在存在这样的Child
时才实例化,这意味着确实存在实现。有什么问题?我该如何获得所需的设计? (*)
还是仅由于Base
的构造函数中存在这样一个纯虚方法调用而引起问题,因为“第一个孩子”本身也可能是抽象的?
(*)也许我对这个问题的整体看法存在很大缺陷,请赐教,然后...
(**)这些空的实现防止了“纯方法调用”错误(?),但当然会调用父方法,而不是子方法。