【发布时间】:2012-11-12 07:59:31
【问题描述】:
考虑以下内容。
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 的每个对象都是通用的,因为它们仅在编译时需要。而且由于基类和子类的内部实现略有不同,它们之间的最佳关系是super class - child class。
现在是我原来的问题的理由吗?
【问题讨论】:
-
不可能。你想要动态调度而不使用
virtual,这是矛盾的(除非你手动重新实现你的对象系统)。 -
来吧,要强制
b.printX()打印 2 只需将X替换为printX()定义中的 2 ;-) -
不,我不想使用动态调度。我想永远使用静态成员。
-
除了@BasileStarynkevitch 的评论,考虑一下:A 怎么知道B 的内容?如果你说“让 B 成为 A 的朋友”,那么这只是糟糕的设计,A 仍然必须将 X 称为 B::X 才能获得 B 对 X 的值。(事实上你可以引用 A: :X 因为 X 只是为了方便。)
-
@jpm,展览
structs之间的友谊目的是什么?
标签: c++ static-members