【发布时间】:2018-02-27 18:29:33
【问题描述】:
我有一个基类和几个派生类。派生类具有通用方法,例如activate() 或init(),它们的实现方式略有不同。所以,我将activate() 和init() 设为纯虚拟。
然后,有像doSomething() 这样的方法,90% 的派生类以不同的方式使用。其他 10% 不需要该功能。
像下面这样继承doSomething()是合理的做法吗?
基类:
class base {
public:
virtual void activate() = 0;
virtual void init() = 0;
virtual void doSomething(){ /* internal log that the function is not implemented */ };
};
以及派生类:
class derivedA: public base {
public:
virtual void activate() override { /* activate A */ };
virtual void init() override { /* init A */ };
virtual void doSomething() override { /* do something in A */ };
};
//class derivedB to class derivedI like class derivedA
class derivedJ: public base {
public:
virtual void activate() override { /* activate J */ };
virtual void init() override { /* init J */ };
// doSomething() is not overriden and the implementation of base is used
};
这是一种可行的方法还是建模可能有问题?
【问题讨论】:
-
是的。请阅读良好的C++ programming book,阅读有关vtable-s 的内容,(使用所有警告和调试信息进行编译(
g++ -std=c++11 -Wall -Wextra -g与GCC...),在调试器中逐步运行您的代码以了解什么是正在发生。 -
不确定是否有帮助,但请注意可能包含纯虚拟函数的定义。不过,它只对显式超级调用有用。
-
@BasileStarynkevitch 你确定你评论的问题是正确的吗?这是一个与语言无关的问题。此处与 C++ 特定的实现细节高度无关。
-
Visitor_pattern 可能会让您感兴趣。
标签: c++ function class oop inheritance