检查2个变量的动态类型的继承 - 但它们在范围内未声明

时间:2017-04-04 13:59:36

标签: c++ c++11 inheritance incomplete-type

是否可以检查2个变量(例如BC)的基础类型(例如bc)之间的继承(如果两者都未在范围?

我认为这是不可能的,但我不确定。

Test1.h: -

#include <vector>
class A{};
std::vector<A*> test1();

Test1.cpp: -

enter image description here

#include "Test1.h"
class B : public A{};
class C : public B{};
class D : public A{};
std::vector<A*> test1(){
    A* b=new B();     A* c=new C();     A* d=new D();
    std::vector<A*> re;  
    re.push_back(b);  re.push_back(c);  re.push_back(d);
    return re;
}

Test2.cpp ;请注意,此处未知B C D(按设计): -

#include "Test1.h"
int test2(){
    std::vector<A*> v=test1();
    A* b=v[0];  A* c=v[1];  A* d=v[2];
    isInherit(b,c); //true
    isInherit(c,d); //false
    isInherit(b,d); //false
}

如果答案是肯定的,请说明如何编码bool isInherit(A* base,A* derive){}

请注意,不允许修改class A (因此,不允许设置non-static field of A = a value depending on type的黑客。)

我可以在我的代码中使用它作为某种黑魔法。

1 个答案:

答案 0 :(得分:1)

排序。

需要virtual bool A::baseOf(A const* derived) const = 0bool B::baseOf(A const* derived) const override { return dynamic_cast<B*>(derived); }

现在,您可以检查foo->baseOf(bar)当您拥有的是A的定义时。

如果C忘记覆盖B::baseOf,事情就会崩溃。