考虑以下.
struct A { static const int X = 1; static void printX() {std::cout << "X " << X << std::endl; }; }; struct B: public A { static const int X = 2; }; int main(argc argv){ B b; b.printX(); }
如何强制b.printX()打印值2?
– 常量和方法 – 必须是静态的.因此,虚拟方法并不适用.
对于那些认为他比我更了解我的任务的人而且想看到我重新思考它我会解释我努力的最终目标:)
想象一下基于静态常量集的行为的类.实现具有不同常量集并因此具有不同行为的子类的最简单方法是使用特定的常量值集从前一个类派生类.可以使用虚拟检查来解决该任务.原因可能,毫无疑问.但是根据建模实体的理论,这个解决方案不是很纯粹.在这种情况下使用虚拟方法将比正确的实现更具窍门.
例如,IR通道具有不同的脉冲持续时间和封装结构的时序.使用一组特定的常量值定义一组子类(不同的IR通道实现)很方便.这些值是静态的,因为它们对于class和const的每个对象都是通用的,因为它们仅在编译时需要.并且因为基类和子类的内部实现略有不同,所以它们之间的最佳关系是超类 – 子类.
我现在的问题是否合理?
解决方法
您将需要一个模板,并更改继承以使用模板,如您所见.诀窍是让它工作是否派生类有一个X来掩盖基类X.
template<class C> struct A { static const int X = 1; template<typename T> static int getX(decltype(T::X)*) { return T::X; } template<typename T> static void getX(...) { return X; } static void printX() { std::cout << "X " << getX<C>(0) << std::endl; } }; struct B: public A<B> { static const int X = 2; }; struct B2: public A<B2> { // No X }; int main(){ B b; b.printX(); // Prints X 2 B2 b2; b2.printX(); // Prints X 1 }