В первом случае вы скрываете определение в родительском классе. Это означает, что он будет вызываться только в том случае, если вы имеете дело с объектом как дочерний класс. Если вы примените класс к его родительскому типу, будет вызван метод parent. Во втором случае метод переопределяется и будет вызываться независимо от того, был ли объект включен в качестве дочернего или родительского класса.
Если вы беспокоитесь о распределении многих небольших объектов кучи, тогда вектор может быть лучшим выбором контейнера, а не списком и деком. список будет выделять узел в куче каждый раз, когда вы вставляете объект в список, тогда как вектор будет хранить все объекты в смежной области памяти в куче.
Если у вас есть:
std::vector<Dog> dogs;
std::vector<Cat> cats;
std::vector<Animal*> animals;
void addDog(Dog& dog, std::vector<Dog>& dogs, std::vector<Animal*>& animals) {
dogs.push_back(dog);
animals.push_back(&dog);
}
Затем все собаки и кошки хранятся в двух смежных областях памяти на куче.
variant
.
– v.oddou
7 April 2015 в 01:38
Я понимаю, что этот вопрос старый, но я нашел несколько довольно приемлемое решение.
Успение:
Вы знаете все производные классы заранее (учитывая ваше редактирование, это true).
Trick:
Использование boost :: variant ( http://www.boost.org/doc/libs/1_57_0/doc/html/variant. html )
Примеры классов:
class Animal {
public:
virtual void eat() = 0;
};
class Cat : public Animal {
virtual void eat() final override {
std::cout << "Mmh, tasty fish!" << std::endl;
}
};
class Dog: public Animal {
virtual void eat() final override {
std::cout << "Mmh, tasty bone!" << std::endl;
}
};
Пример варианта / посетитель:
typedef boost::variant<Cat, Dog> AnimalVariant;
class AnimalVisitor : public boost::static_visitor<Animal&> {
public:
Animal& operator()(Cat& a) const {
return a;
}
Animal& operator()(Dog& a) const {
return a;
}
};
Пример использования:
std::vector<AnimalVariant> list;
list.push_back(Dog());
list.emplace_back(Cat());
for(int i = 0; i < 5; i++) {
for(auto& v : list) {
Animal& a = v.apply_visitor(AnimalVisitor());
a.eat();
}
}
Пример вывода
Mmh, tasty bone!
Mmh, tasty fish!
Mmh, tasty bone!
Mmh, tasty fish!
Mmh, tasty bone!
Mmh, tasty fish!
Mmh, tasty bone!
Mmh, tasty fish!
Mmh, tasty bone!
Mmh, tasty fish!
sigma
(стандартное отклонение) и выбрать с помощью mpl::if_
или что-то еще, или использовать SFINAE или просто специализацию для реализации с использованием варианта для низкой сигмы и пулов для высоких сигм.
– v.oddou
7 April 2015 в 01:43
new
не приветствуются ..... на микроконтроллерах не поддерживается только повышение, поэтому я написал свой собственный класс variant
– DarthRubik
10 July 2016 в 21:56
Возможно, вы могли бы сделать что-то с простым классом-оболочкой для объединения, содержащего супер-набор данных, необходимых для каждого случая. Это будет содержать указатель на общие стратегии объекты, содержащие код для разных типов поведения. Таким образом, кошка является объектом класса PolyAnimal с видамиName = «cat», PredatorFeedingStrategy и т. Д.
Вероятно, лучшим способом решения основной проблемы является создание соответствующих пользовательских распределителей для более естественного дизайна.