gpt4 book ai didi

c++如何在派生类中实现常量静态成员

转载 作者:行者123 更新时间:2023-11-28 00:08:42 30 4
gpt4 key购买 nike

在 C++ 中,我有几个继承自抽象父类(super class)的类。子类具有共享相同名称的静态属性 type但当然有不同的值(value)观。我的问题是什么是最好的实现方法以及每种实现的优缺点。

附言:有一些相关的讨论,例如 here但大多数都没有解释为什么不应该使用下面的方法(在我的机器上有效)1。此外,方法 2 中的子类方法不是静态的,我们必须获得一个实例来调用它们。

方法 1:未初始化 const static在父类(super class)中

class Abstract {
public:
const static int type;
};

class C1: public Abstract {
public:
const static int type = 1;
};

class C2 : public Abstract {
public:
const static int type = 2;
};

方法二:使用虚函数代替变量

class Abstract {
public:
virtual int get_type() = 0;
};

class C1: public Abstract {
public:
int get_type() {return 1;}
};

class C2 : public Abstract {
public:
int get_type() {return 2;}
};

我不知道的其他方法...

编辑:

正如下面提到的一些答案/评论,我试图在运行时识别实际类型。但是我真的想不出更好的设计。

为了使其具体化,我们假设 Abstract=EduInst对于教育机构,C1=Univ , C2=College等。我有一个 std::map<Key, EduInst*>存储所有机构,这些机构在运行时根据用户输入生成。有时我只需要对 Univ 进行操作s 或 College秒。什么是实现它的好方法?

最佳答案

首先是警告:

继承描述了与基类的“是一种”关系。只有当你在同一个容器中存储不同种类的对象,当这些种类的对象绝对共享相同的接口(interface),并且不需要对任何一个派生类进行特殊处理时(即当你,对象的消费者),它才有意义不需要知道它的类型)。

此外,如果你只有几种相同的东西,而这些东西在编译时可能是已知的,那么使用继承可能是错误的。

如果您继承的对象必须向客户端标识其实际类型,这进一步证明继承是错误的解决方案 - 因为现在您要使用代码来查找代码,这是一个坏主意(它不可测试,当你的程序处于你没有预料到的状态时,它很容易出错)。

此外,如果您有不同的对象但需要存储在同一个容器中,那么 boost::variant 可能是您正在寻找的解决方案。然后,您将使用 boost::static_visitor 对变体中的对象执行操作。这样做的好处是绝对类型安全,编译器不会让您忘记处理类型。

说了这么多……

方法 1 不起作用,因为如果您已经拥有派生类的类型,您将始终获得基类的类型。

方法 2 可行,但它很糟糕并且表明设计已损坏。

关于c++如何在派生类中实现常量静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34132194/

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