に宣言されていないされている両方がスコープ内で宣言されていない場合は2つの変数(例えばb
とc
)の基になる型(例えばB
とC
)の間の継承を確認することが可能です?チェック継承 - しかし、彼らはスコープ
これは不可能だと思いますが、わかりません。
Test1.h: -
#include <vector>
class A{};
std::vector<A*> test1();
Test1.cpp: -
#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
を設定するためのハックが許可されていない。)
私はコード内の黒魔法のいくつかの種類として使用することができます。
あなたのタイプがどのように不完全であるか分かりません。あなたの例では、あなたのタイプが定義されています。代わりにあなたの型を宣言すると、継承を指定することはできません。 –
@FrançoisAndrieux 'Test2.cpp':' B''C''D'は不完全です。 (間違っていますか?) – javaLover
[不完全なクラス](http://en.cppreference.com/w/cpp/language/type#Incomplete_type)は、C++で特別な意味を持ちます。宣言されているが定義されていないクラスを示します。 'Test2.cpp'では、' B'、 'C'、' D'のどれも宣言されていません。 –