如何检查派生类的类型?(C++ Instanceof)

问题描述 投票:1回答:2

比方说,我有一些基本的抽象类和三个不同的类来派生和实现它的方法。是否有一个像C#一样的 "类型 "对象?或者换句话说,我如何获得所有这些类的实例?

#ModuleBase.cpp
class ModuleBase {

};

#Module1.cpp
class Module1 : public virtual ModuleBase {

};

#Module2.cpp
class Module2 : public virtual ModuleBase {

};

#Module3.cpp
class Module3 : public virtual ModuleBase {

};
c++ inheritance virtual-inheritance
2个回答
3
投票

你可以创建 instanceof 样的方法,可以使用模板和 std::is_base_of (1)或 dynamic_cast 只适用于多态对象(2).

1 现场样品

template<typename Base, typename T> inline bool instanceof(const T) {
   return is_base_of<Base, T>::value;
}
int main() {
   Module1 module;
   if(instanceof<Module1>(module)) {
      cout << "Module1" << endl;
   }
   if(instanceof<Module2>(module)) {
      cout << "Module2" << endl;
   }
   if(instanceof<ModuleBase>(module)) {
      cout << "ModuleBase" << endl;
   }
}

2 现场样品

class ModuleBase { public: virtual ~ModuleBase(){} };

template<typename T> inline bool instanceof(const ModuleBase * base) {
   return dynamic_cast<const T*>(base);
}
int main() {

   Module1* module = new Module1();

   if(instanceof<Module1>(module)) {
      cout << "Module1" << endl;
   }
   if(instanceof<Module2>(module)) {
      cout << "Module2" << endl;
   }
   if(instanceof<ModuleBase>(module)) {
      cout << "ModuleBase" << endl;
   }
}

对象的类型都是 ModuleBaseModule1. 我想有了这些你就可以达到你所需要的目的。


2
投票

除了其他的答案,你可以 产生 一些C++代码做你想要的事情。例如,可以考虑使用 GPP 从你 建立自动化 工具(如 Makefile)或编写一个简单的 AWK, 诡计蟒蛇 脚本来做你想要的事情(或者是上面的一些临时的C++生成器)。ANTLR灵感来自于 SWIG),并根据你的需要生成一些C++代码。我的过时的 GCC MELT 在Linux上做到了(动态地,在运行时)。

Qt 拥有 元对象 协议正是这样做的。你可以从它的 moc (这是开源的)生成C++代码。

也可以看看正在进行中的(但在2020年2月的胚胎)。RefPerSys 项目。我们希望使用这些想法,并开始实施它们。请注意,在Linux上 dlopen 千呼万唤始出来 实际上在生成的和临时的C++代码编译产生的共享对象上。

© www.soinside.com 2019 - 2024. All rights reserved.