2017-04-04 48 views
1

未申报是否有可能检查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; 
} 

测试2.cpp;需要注意的是,BCD不知道这里(设计): -

#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是不允许的。)

我可以用它作为我的代码里面的一些种类的黑魔法。

+0

我不明白你的类型是不完整的。在你的例子中,你的类型是被定义的。如果你转发声明你的类型,那么你不能指定任何继承。 –

+0

@FrançoisAndrieux在'Test2.cpp':'B'' C'' D'不完整。 (错误?) – javaLover

+0

[不完整的类](http://en.cppreference.com/w/cpp/language/type#Incomplete_type)在C++中有特定的含义。它表示已声明但未定义的类。在'Test2.cpp'中没有声明'B','C'或'D'。 –

回答

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定义。

+0

黑客!你推动我的规则的信封。 +1 – javaLover

+0

如果只允许修改'Test2.cpp',这是不可能的,对吧? – javaLover

+0

确实。我的想法建立在每个类都知道它自己的类型的概念上,即使“Test2.cpp”没有。 – MSalters