在C ++中查找对象的types

我有一个类A和从它inheritance的另一个类B。我重写一个接受typesA的对象作为参数的函数,所以我不得不接受一个答:但是,我后来调用只有B的函数,所以我想返回false,如果传递的对象不是B类,就不要继续。

找出传递给我的函数的对象的types的最佳方法是什么?

dynamic_cast应该做的伎俩

TYPE& dynamic_cast<TYPE&> (object); TYPE* dynamic_cast<TYPE*> (object); 

dynamic_cast关键字将一个数据从一个指针或引用types转换到另一个指针或引用types,执行运行时检查以确保转换的有效性。

如果您尝试转换为不是实际对象types的types的指针,则转换的结果将为NULL。 如果您尝试转换为引用不是实际对象types的types,则bad_cast将抛出bad_castexception。

确保基类中至less有一个虚函数可以使dynamic_cast工作。

dynamic转换是最好的你的问题描述,但我只是想补充说,你可以find类的types:

 #include <typeinfo> ... string s = typeid(YourClass).name() 

这被称为RTTI,但是你几乎肯定希望在这里重新考虑你的devise,因为findtypes并根据它做特殊的事情会使你的代码变得更脆弱。

可能在你的对象中embedded一个ID“标签”,并用它来区分A类对象和B类对象。

然而这在devise上显示出一个缺陷。 理想情况下,A中没有的B中的方法应该是A的一部分,但是留空,B将覆盖它们。 这消除了特定于类的代码,更符合OOP的精神。

你在寻找dynamic_cast<B*>(pointer)吗?

为了完成,我将构build出Robocide,并指出typeid可以单独使用而不使用name():

 #include <typeinfo> #include <iostream> using namespace std; class A { public: virtual ~A() = default; // We're not polymorphic unless we // have a virtual function. }; class B : public A { } ; class C : public A { } ; int main(int argc, char* argv[]) { B b; A& a = b; cout << "a is B: " << boolalpha << (typeid(a) == typeid(B)) << endl; cout << "a is C: " << boolalpha << (typeid(a) == typeid(C)) << endl; cout << "b is B: " << boolalpha << (typeid(b) == typeid(B)) << endl; cout << "b is A: " << boolalpha << (typeid(b) == typeid(A)) << endl; cout << "b is C: " << boolalpha << (typeid(b) == typeid(C)) << endl; } 

输出:

 a is B: true a is C: false b is B: true b is A: false b is C: false 

你的描述有点混乱。

一般来说,尽pipe一些C ++实现有它的机制,但你不应该问这个types。 相反,你应该对指向A的指针做一个dynamic_cast。这将会在运行时检查指向A的指针的实际内容。 如果你有一个B,你会得到你的指针B.否则,你会得到一个exception或null。

正如其他人指出的,你可以使用dynamic_cast。 但是通常使用dynamic_cast来找出你正在处理的派生类的types,这表明了糟糕的devise。 如果你重载一个函数,它将A的指针作为参数,那么它应该能够使用A类本身的方法/数据,而不应该依赖于类B的数据。在你的情况下,如果你不是重写确信你写的方法只适用于B类,那么你应该在B类中写一个新的方法。

因为你的类不是多态的。 尝试:

 struct BaseClas { int base; virtual ~BaseClas(){} }; class Derived1 : public BaseClas { int derived1; }; 

现在BaseClas是多态的。 我改变了类结构,因为一个结构的成员默认是公共的。

使用重载的函数。 不需要dynamic_cast甚至RTTI支持:

 class A {}; class B : public A {}; class Foo { public: void Bar(A& a) { // do something } void Bar(B& b) { Bar(static_cast<A&>(b)); // do B specific stuff } };