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