class Attraction {
};
class Museum : public Attraction {
private:
double price;
public:
void setPrice(double Price) {
price = Price;
}
double getPrice() {
return price;
}
};
class Park : public Attraction {
public:
double getPrice() {
return 0;
}
};
class Theatre : public Attraction {
private:
double price;
public:
void setPrice(double Price) {
price = Price;
}
double getPrice() {
return price;
}
};
int _tmain(int argc, _TCHAR* argv[]) {
vector<Attraction> attraction;
vector<Attraction>::iterator i;
for (i = attraction.begin(); i != attraction.end(); i++) {
if (i->getPrice() < 5) {
cout << endl;
}
}
}
-3
A
ответ
2
vector<Attraction>
выполняет нарезку объектов, поэтому вы никогда не сможете получить доступ к getPrice()
производных классов. Вместо этого вам нужно использовать полиморфизм, где у вас есть виртуальный метод double GetPrice()
в классе Attraction
, а затем используйте vector<Attraction*>
с new
/delete
для объектов. Не забудьте также сделать деструктор в Attraction
, так что вы можете delete
объект-потомк с помощью базового указателя.
2
То, что вы пытаетесь сделать, невозможно с кодом, который вы указали. Вы не используете полиморфизм правильно.
Попробуйте что-то больше, как это вместо:
class Attraction
{
public:
Attraction() {}
virtual ~Attraction() {}
virtual double getPrice(double Price)
{
return 0.0;
}
};
class PriceyAttraction : public Attraction
{
private:
double price;
public
PriceyAttraction(double Price = 0.0) : Attraction(), price(Price) {}
virtual double getPrice()
{
return price;
}
void setPrice(double Price)
{
price = Price;
}
};
class Museum : public PriceyAttraction
{
public:
Museum(double Price = 0.0) : PriceyAttraction(Price) {}
};
class Park : public Attraction
{
public:
Park() : Attraction() {}
};
class Theatre : public PriceyAttraction
{
public:
Theatre(double Price = 0.0) : PriceyAttraction(Price) {}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<Attraction*> attraction;
attraction.push_back(new Museum(5.00));
attraction.push_back(new Park);
attraction.push_back(new Theatre(7.50));
std::vector<Attraction*>::iterator i;
for (i = attraction.begin(); i != attraction.end(); ++i)
{
std::cout << i->getPrice() << std::endl;
//...
}
for (i = attraction.begin(); i != attraction.end(); ++i)
{
delete *i;
}
}
Если вы используете C++ 11 или более поздней версии, вы можете использовать std::unique_ptr
управлять объектом deallocations для вас:
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<std::unique_ptr<Attraction>> attraction;
attraction.emplace_back(new Museum(5.00));
attraction.emplace_back(new Park);
attraction.emplace_back(new Theatre(7.50));
/* or:
attraction.push_back(std::unique_ptr<Attraction>(new Museum(5.00)));
attraction.push_back(std::unique_ptr<Attraction>(new Park));
attraction.push_back(std::unique_ptr<Attraction>(new Theatre(7.50)));
*/
/* or:
attraction.push_back(std::make_unique<Museum>(5.00));
attraction.push_back(std::make_unique<Park>());
attraction.push_back(std::make_unique<Theatre>(7.50));
*/
vector<Attraction>::iterator i;
for (i = attraction.begin(); i != attraction.end(); ++i)
{
std::cout << (*i)->getPrice() << std::endl;
//...
}
}
Смежные вопросы
- 1. Как я могу проверить цену доставки от MySQL
- 2. Как я могу добавить цену группы продуктов?
- 3. Как я могу получить цену другой таблицы
- 4. Как проверить тип подкласса?
- 5. Как наследовать статическое свойство с уникальным значением для каждого подкласса?
- 6. Как я могу назвать метод подкласса?
- 7. Как я могу достичь своего подкласса? C++
- 8. Как я могу запланировать цену акции (высокую и низкую) как палку для каждого дня в R?
- 9. Я создаю класс кассира, но я не могу получить имя и цену каждого элемента для отображения
- 10. Как проверить IPN PayPal на цену продукта?
- 11. Как автоматически проверить купоны и настроить цену?
- 12. Как я могу это проверить?
- 13. Как я могу проверить пароль?
- 14. Как я могу проверить stunnel?
- 15. Как я могу проверить интерфейс?
- 16. Как я могу это проверить?
- 17. Как я могу проверить pspell?
- 18. Как я могу проверить прочность?
- 19. Как я могу проверить класс?
- 20. Как я могу проверить TextPainter?
- 21. Как я могу проверить сообщение?
- 22. Как я могу проверить RoutedUICommand?
- 23. Как я могу проверить Lunascript
- 24. Как я могу проверить переключатель?
- 25. Как я могу проверить это?
- 26. Как я могу проверить «prevObject»?
- 27. Как я могу проверить validate_uniqueness_of?
- 28. Получить самую последнюю цену для каждого пункта
- 29. Как я могу обновить общую цену, указанную для каждого элемента в спискеView, как только я удалю один из элементов?
- 30. Как я могу сделать цену с помощью jquery?
Вы можете» т с тем, как вы его разработали. 'Attraction' не имеет метода getPrice – smac89
@khredos: это не основная проблема (теоретически у вас может быть статический посетитель), это разрезает, что убивает это. – lorro
Короткий ответ - совсем не так. Но «правильный путь» зависит от специфики вашего варианта использования. Вам может понадобиться вектор 'unique_ptr', вы можете захотеть' ptr_vector'. Возможно, вы захотите чего-то еще. Например, какую семантику вы хотите, если сбор копируется? –