2017-04-04 2 views
1

nicht deklariert Ist es möglich, Vererbung zwischen zugrunde liegenden Typ (zB B und C) von 2 Variablen (zB b und c) zu überprüfen, ob beide nicht in den Anwendungsbereich erklärt ?Check Vererbung von dynamischen Typen von 2 Variablen - aber sie sind in ihrem Umfang

Ich denke, das ist unmöglich, aber ich bin mir nicht sicher.

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; Man beachte, dass BCD sind hier nicht bekannt ist (durch Design): -

#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 
} 

Lautet die Antwort ja, bitte zeigen, wie bool isInherit(A* base,A* derive){} zu codieren.

Beachten Sie, dass das Ändern von class A nicht zulässig ist.
(So zu setzen ein Hack a non-static field of A = a value depending on type ist nicht erlaubt.)

ich es als einige Arten von black-magic in meinem Code verwenden.

+0

Ich verstehe nicht, wie Ihre Typen unvollständig sind. In Ihrem Beispiel sind Ihre Typen definiert. Wenn Sie die Typen stattdessen weiterleiten, können Sie keine Vererbung angeben. –

+0

@ François Andrieux Zu 'Test2.cpp':' B' 'C'' D' sind unvollständig. (Falsch?) – javaLover

+0

Eine [unvollständige Klasse] (http://en.cppreference.com/w/cpp/language/type#Incomplete_type) hat eine spezifische Bedeutung in C++. Es gibt eine Klasse an, die deklariert, aber nicht definiert wurde. In 'Test2.cpp' wurde keiner von' B', 'C' oder' D' deklariert. –

Antwort

1

Sortieren von.

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

Dies ermöglicht es Ihnen jetzt foo->baseOf(bar) zu überprüfen, wenn alles, was Sie haben, ist die Definition von A.

Die Dinge zusammenbrechen, wenn C vergisst B::baseOf außer Kraft zu setzen.

+0

Hacker! Du schiebst den Umschlag meiner Regel. +1 – javaLover

+0

Wenn nur eine Modifikation von 'Test2.cpp' erlaubt ist, ist es unmöglich, oder? – javaLover

+0

In der Tat. Meine Idee basiert auf der Vorstellung, dass jede Klasse ihren eigenen Typ kennt, auch wenn 'Test2.cpp' das nicht tut. – MSalters

Verwandte Themen