2015-04-28 1 views
2

Если у меня есть класс, который наследует от одного интерфейса (ниже) и wxPaneC++ Множественное Наследование от интерфейсов и литья

class iClassA 
{ 
public: 
    virtual ~iClassA() {} 
    virtual bool FuncA() = 0; 
}; 

Concerete:

class ConcereteClass : public iClassA, wxPane 
{ 
public: 
    bool FuncA(); 
}; 

ли приемлемо иметь std::vector типа iClassA *, который содержит мои ConcereteClass или будет vmaps запутаться при кастинге?

+1

Что такое 'vmaps'? Какую проблему вы ожидаете? Разумеется, нет никакой проблемы в хранении производного экземпляра через базовый класс, вот что такое полиморфизм. – Quentin

+0

Внимание: 'class ConcreteClass: public iClassA, public wxPane'! То, как вы написали, означает ** частное наследование ** wxPane: это только ConcreteClass знает, что он наследует его, а внешние миры не могут получить доступ к любому из членов/функций wxPane. – Christophe

ответ

6

Да, это вполне приемлемо. Это довольно распространенная модель.

std::vector<iClass*> v; 
v.push_back(new ConcreteClass); 
v[0]->FuncA(); // calls ConcreteClass::FuncA(); 

if (ConcreteClass* cc = dynamic_cast<ConcreteClass*>(v[0])) { 
    // succeeds 
} 

delete v[0]; // correctly calls ConcreteClass::~ConcreteClass() 

Обратите внимание, что вы унаследовав от wxPaneprivate лы.

+0

Ах, спасибо, я не был уверен, что какие-либо данные в классе concerete будут потеряны, поскольку они сохранены на карте только как часть дерева наследования –

+1

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

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

  • Нет связанных вопросов^_^