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

标签 c++ inheritance virtual-inheritance

假设我有一些基础抽象类和三个派生和实现其方法的不同类。是否像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 {

};

最佳答案

您可以创建类似于instanceof的方法,这些方法可以使用模板和 std::is_base_of (1)或 dynamic_cast 仅用于多态对象(2)来检测对象的类型。

1 Live sample

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 Live sample
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。我认为您可以通过这些实现您所需要的。

关于c++ - 如何检查派生类的类型? (C++ Instanceof),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60066535/

相关文章:

c++ - 使用内联静态数据成员有什么潜在的缺陷吗?

减少基类中小子类数量的 Pythonic 方法?

c++ - 具有协变返回类型的方法在VC++上崩溃

另一个基类中的c++抽象类实现

c++ - OpenGL:点在无穷远的三角形

c++ - 在另一个(来自抽象父级)父级中定义抽象方法?

jquery - 新内容不继承具有无限滚动的父 div 的样式

c++ - 如何定义可以继承的模板特定类型?

c++ - 从抽象基类的多个部分实现继承?

c++ - 当同时使用boost计算和boost::range时,如何避免boost::compute::zip_iterator和boost::iterators::zip_iterator冲突?