2017-04-04 12 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; 
} 

Test2.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); }

これを必要とする今、あなたはあなたが持っているすべてのC忘れがB::baseOfを上書きする場合

物事を打破んA.の定義であるときfoo->baseOf(bar)を確認することができます。

+0

ハッカー!あなたは私のルールの封筒を押します。 +1 – javaLover

+0

'Test2.cpp'の修正だけが許されていれば、それは不可能ですよね? – javaLover

+0

確かに。私の考えは、「Test2.cpp」がそうでなくても、それぞれのクラスが独自の型を知っているという概念に基づいています。 – MSalters

関連する問題