2011-01-16 3 views
2

Так как правило, имеющиеКак проверить, расширяет ли один класс C++ другой (например, если это другой интерфейс)?

class A { ... }; 
class B { ... }; 
class C: public A, public B {}; // C inherits from A and B. 

, когда мы создаем экземпляр C и хотите передать его в какую-нибудь функцию хо мы проверить, если класс мы переходим к функции Расширение?

ответ

9

C определяется как наследующий A так что нет необходимости проверять:

Это является обязательным, что экземпляр C также AB).

Однако, если у вас есть функция, принимающая A в качестве параметра, вы можете использовать dynamic_cast<>, чтобы проверить, если экземпляр на самом деле C:

void function(const A& a) 
{ 
    const C* c = dynamic_cast<const C*>(&a); 

    if (c) 
    { 
    // a is an instance of C and you can use c to call methods of C 
    } else 
    { 
    // a is not an instance of C. 
    } 
} 

Для этого, чтобы работать, однако, типа базового класса должен быть полиморфный (он должен иметь хотя бы виртуальный метод).

+0

Я побежал 'сопзЬ C * с = dynamic_cast (& а) 'но это дало мне ошибку: не может dynamic_cast 'и a' (типа 'class A *') для ввода 'const class C *' (тип источника не является полиморфным)' – Barney

+1

@BarneyHsiao: я обновил ответ, чтобы объяснить, почему вы получите эту ошибку. В двух словах, базовый класс должен иметь по крайней мере один виртуальный метод (это может быть деструктор), если вы хотите использовать 'dynamic_cast <>' на нем. – ereOn

3

Единственный раз, когда вам нужно будет это сделать, во время компиляции, поскольку неявное преобразование работает везде. Но если вы хотите, чтобы увидеть, если какой-то тип T является базой некоторого типа S, то вы можете использовать SFINAE (или просто использовать is_base_of <>):

template < typename T, typename S > 
struct is_base_of // checks if T is a base of S 
{ 
    typedef char (yes&) [1]; 
    typedef char (no&) [2]; 

    void yes check(T*); 
    void no check(...); 

    enum { value = sizeof(check(static_cast<S*>(0))) == sizeof(yes); } 
}; 
Смежные вопросы