我有一个A类和另一个继承它的类,B.我重写了一个接受A类对象作为参数的函数,所以我必须接受一个A.但是,我后来调用只有B的函数,所以我想返回false,如果传递的对象不是B类,则不继续.
找出传递给我的函数的对象的最佳方法是什么?
yes*_*aaj 151
dynamic_cast应该可以解决问题
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
Run Code Online (Sandbox Code Playgroud)
该dynamic_cast
关键字从一个指针或引用类型转换基准到另一个,执行运行时检查以确保铸造的有效性.
如果您尝试转换为指向不是实际对象类型的类型的指针,则转换的结果将为NULL.如果您尝试强制转换为引用不是实际对象类型的类型,则强制类型转换将抛出bad_cast
异常.
确保Base类中至少有一个虚函数可以使dynamic_cast工作.
Rob*_*ide 142
动态强制转换最适合您对问题的描述,但我只想补充一点,您可以找到类类型:
#include <typeinfo>
...
string s = typeid(YourClass).name()
Run Code Online (Sandbox Code Playgroud)
可能会在您的对象中嵌入一个ID"标记",并用它来区分A类对象和B类对象.
然而,这显示了设计中的缺陷.理想情况下,A中没有的那些方法应该是A的一部分而是留空,而B则覆盖它们.这取消了特定于类的代码,更符合OOP的精神.
为了完成,我将构建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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
a is B: true
a is C: false
b is B: true
b is A: false
b is C: false
Run Code Online (Sandbox Code Playgroud)