我有一个名为 A 的接口(interface)类和两个实现 A 的基类 B 和 C。在我的代码中,有时我需要确定一个实例是 B 还是 C,我宁愿没有本地非静态成员A 确定实现类是 B 型还是 C 型。出于性能原因,我也不想使用 dynamic_cast 或其他形式的反射来确定它们的类型。
是否建议为 A 创建一个基类 AA,它接受一个 int 类型的模板参数,并使用该值来确定 B 或 C 的类型?
或者在 A 中定义一个返回枚举类型的静态方法如何,该方法被 B 和 C 中的类似方法所掩盖?
最佳答案
您是否试图在一般情况下避免虚函数?在这种情况下,您可以将该功能添加到 A 本身:
struct A {
enum ClassType { ClassTypeB, ClassTypeC };
const ClassType mClassType;
ClassType classType() const
{ return mClassType; }
protected:
A(ClassType type) : mClassType(type) { }
};
然后在子类中,您将使用类似以下内容初始化 A:
struct B: public A {
B() : A(ClassTypeB) { }
};
struct C: public A {
C() : A(ClassTypeC) { }
};
// ...
A* obj1 = new B;
A* obj2 = new C;
obj1->classType() == A::ClassTypeB; // true
obj2->classType() == A::ClassTypeC; // true
这可以让您避免任何虚方法分派(dispatch),但缺点是 A
现在必须了解其子类。
关于c++ - 在没有反射/内省(introspection)的情况下确定 C++ 中的类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18616523/