2015-12-18 3 views
2

Возможно ли, что на C++ есть class, чье определение зависит от контекста его построения?Внедрение класса на основе C++

Например, мог class A с несколькими конструкторами наследуют от class B после вызова конкретного конструктора, а вместо того, чтобы унаследовать от class C после вызова другого конструктора?

Если нет, то почему? И если так, как это будет достигнуто?

ответ

2

Нет, это невозможно динамически.

Если A наследуется от B, это должно быть какое-то отношение B («is-a»). Эта взаимосвязь означает все объекты класса A, независимо от контекста.

Тот факт, что вы хотите наследовать иногда от B, иногда от C, предполагает, что вы думаете об отношениях «has-a». Это будет осуществляться по составу:

class B; 
class C; 
class A { 
    B *hasB; // of course in real lif you'd use unique_ptr or shared_ptr... 
    C *hasC; 
public: 
    A(B *b); // would set hasB but set hasC to nullptr. 
    A(C *c); // would set hasC but set hasB to nullptr. 
    ... 
}; 

Если ваша проблема не будет обрабатываться динамически, но только во время компиляции, вы можете думать о шаблонах:

template <class T> 
class A : public T { 
    ... 
};  

A<B> ab; // A<B> inherits from B 
A<C> ac; // A<C> inherits from C 
// but attention: both class are two different classes. 
1

Да. Но не так, как вы явно предложили. Наследование не зависит от конструктора - поэтому вы не можете достичь такого «контекстно-специфического» поведения таким образом.

Вот несколько вариантов (обратите внимание, что существуют и другие способы, чтобы сделать это):

относительно простой путь, особенно если вы хотите, чтобы скрыть, что ваш класс А имеет признаки классов В или С, является частной наследуйте от B и C. Затем установите флаг в конструкторе, который сообщает классу использовать функции из B или функций из C. Затем все ваши методы класса A просто проверяют этот параметр и вызывают соответствующие методы B или C.

В качестве альтернативы вы можете использовать шаблоны. Шаблон посетителя приходит на ум как один основанный на шаблонах подход, который выполняет то, что вы, кажется, описываете.

Смежные вопросы