gpt4 book ai didi

C++ 静态常量成员覆盖

转载 作者:可可西里 更新时间:2023-11-01 16:33:08 24 4
gpt4 key购买 nike

考虑以下因素。

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 channel 具有不同的脉冲持续时间和封装结构。使用一组特定的常量值定义一组子类(不同的 IR channel 实现)很方便。这些值是静态的,因为它们对于 class 的每个对象都是通用的,而 const 因为它们仅在编译时需要。并且由于基类和子类的内部实现略有不同,它们之间的最佳关系是super class - child class
现在我原来的问题是有道理的吗?

最佳答案

您将需要一个模板,并更改继承以使用该模板,如您所见。诀窍是无论派生类是否有一个 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
}

关于C++ 静态常量成员覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13340074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com