C++多态性:如何测试一个类是否派生自另一个基类



对不起标题的措辞;我不知道如何让它变得更好。但我问题的要点是:

#include <iostream>
using namespace std;
class Base {};
class Base2 {};
class C : public Base, public Base2 {};
class D : public Base {};
void isDerivedFromBase2(Base *p) {
if (...) { /* test whether the "real object" pointed by p is derived from Base2? */
cout << "true" << endl;
}
cout << "false" << endl;
}
int main() {
Base *pc = new C;
Base *pd = new D; 
isDerivedFromBase2(pc); // prints "true"
isDerivedFromBase2(pd); // prints "false"
// ... other stuff
}

如何测试由基类指针Base *表示的对象是否派生自另一个基类Base2

您可以这样执行dynamic_cast

if (dynamic_cast<Base2 *>(p)) {

在线_编译器

typeid的方法不同,这种方法不需要包含额外的头,但它也依赖于RTTI(这意味着这些类需要是多态的(。

这听起来像是一个X-Y问题。

对RTTI的需要(或测试它派生自哪个类的对象的需要(通常是糟糕设计的标志-您根本不应该需要这样的测试/信息
如果层次结构设计良好,虚拟函数将承担这些测试的角色。

要找出设计不完善的地方,问问自己"一旦我有了这些信息,我该怎么办?"答案总是"我会做一个if/switch/…"。。。区别对待他们";正确的解决方案是以相同的方式处理它们——调用一个虚拟方法,每个对象都携带正确的虚拟方法的知识,该方法知道需要做什么。

相关内容

最新更新