2013-11-30 3 views
-2

Скажем, у меня есть базовый класс Base:C++ Есть ли способ хранения набора производных классов в одном векторе базового класса и по-прежнему доступ к их членам?

class Base 
{ 
} 

и производный классы Derived1

class Derived1: Base 
{ 
    int a; 
} 

Теперь у меня есть вектор:

std::vector<Base*>vec; 

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

Я читал другие ответы, говоря, что бросать классы в вектор в производные классы - плохая идея, поэтому я хочу этого избежать. Я также хочу избежать создания отдельного вектора для каждого производного класса, так как через некоторое время он станет очень грязным. Если у кого-то есть предложение, которое противоречит моему подходу к проблеме вместе, но все же позволяет мне легко управлять многими производными классами, я был бы рад услышать это.

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

+2

Сделать 'зЬй :: вектор ', легко, как это. Нет глупых указателей, без литья, без путаницы. –

+1

Если у вас есть 'Base *' и вы * знаете *, это фактически 'Derived * '(и нужно рассматривать его как таковой), тогда у вас есть проблема с дизайном, поэтому приведение в малейшее количество из ваших забот. Используйте виртуальные интерфейсы, если вам нужен полиморфизм, и если вы этого не сделаете, вам не понадобится «Base *» либо в первую очередь. – syam

ответ

0

Как вы спросили предложение: Не используйте:

std::vector<Base*>vec; 

Скорее сделать:

std::vector<Base>vec; 

Но более того, если вы знаете vec будет хранить Derived1, почему это не так:

std::vector<Derived1> vec; 

Теперь, если вы не делаете то, чтобы получить доступ к элементу a вы можете сделать так:

for(auto iter = vec.begin();iter!=vec.end();iter++) 
{ 
    Derived1* d = dynamic_cast<Derived*>(*iter); 
    if(d!=NULL) 
    { 
     // do anything with d->a 
    } 
}