我不确定在这个上搜索什么,这是一个"虚拟成员变量"还是类似的东西
class ConcreteClass: public AbstractBaseclass {
public:
struct Options {
int x;
string foo;
};
int options(int ac, char ** av, Options& opts) {
// Declare the supported options.
po::options_description desc("Allowed options");
// ... etc, fill in with boost program options
}
virtual void MandatoryFunction1( ... ) { }
}
不同类型的"混凝土类"会有根本不同的东西。。。从其他地方继承Options似乎很愚蠢,因为它必须是一个空的基结构。
有没有一种智能的方法可以通过"AbstractBaseclass"强制派生类必须声明一些"Options"结构,并提供一个函数"Options(("来填充它?这只是为了强制与核心库在派生类中的使用方式保持一致。
*编辑:如果我需要编辑基类来支持这一点,这是可以的。我想也许让它包含一个纯虚拟的options((函数,但我不确定让它接受一个待定义的"options"结构是什么好方法。
我已经看到了一些这样的我如何强迫扩展我的类的人做X类型的问题。真正的问题是你为什么要强迫它你是需要他们来做,还是只是想让?
如果你需要他们来实现该功能,这意味着代码的某些部分实际上会使用,如果他们不实现,编译器将触发错误并无法编译,你的问题就可以在不做任何事情的情况下得到解决。
如果你只是想让他们这样做,重新思考你的策略。强迫他人的代码做一些不需要的事情是没有意义的。也许你的类的某些扩展根本不需要选项,为什么他们不需要来实现该函数,而你也不需要它们?
请注意,很少会发现依赖于实现的任何X::Options
结构的代码(模板除外(,因为您将无法通用地使用该代码——C++使用静态类型。因此,很可能您不是在一般性地使用该代码,或者您需要一个Options
接口。如果你在模板中使用它,代码将无法编译模板,你甚至可以在模板中计算出如何生成一个简单易读的错误消息(想想static_assert
(,如果你不使用它,问题就来了:为什么?
只需遵循两个简单的步骤,您就会得到您想要的:
(1( 使options()
方法在AbstractBaseclass
中成为纯virtual
,因此它将强制每个子class
实现它:
(2( 使struct Options
位于AbstractBaseclass
下的private
说明符内。因此,现在每个子class
都必须有自己的Options
来满足virtual options()
参数。
所以总的来说,你的基础class
看起来像:
class AbstractBaseclass {
struct Options {}; // private
public: // pure virtual
virtual int options(int ac, char ** av, Options& opts) = 0;
};