Вначале я прочитал, и теперь я знаю, что функция виртуального элемента шаблона (пока?) возможна в С++. Обходным путем было бы сделать класс шаблоном, а затем использовать шаблон-аргумент также в функции-члене.
Но в контексте ООП я обнаружил, что приведенный ниже пример не будет очень "естественным", если класс был фактически шаблоном. Обратите внимание, что код фактически не работает, но отчеты gcc-4.3.4: error: templates may not be ‘virtual’
#include <iostream>
#include <vector>
class Animal {
public:
template< class AMOUNT >
virtual void eat( AMOUNT amount ) const {
std::cout << "I eat like a generic Animal." << std::endl;
}
virtual ~Animal() {
}
};
class Wolf : public Animal {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const {
std::cout << "I eat like a wolf!" << std::endl;
}
virtual ~Wolf() {
}
};
class Fish : public Animal {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const {
std::cout << "I eat like a fish!" << std::endl;
}
virtual ~Fish() {
}
};
class GoldFish : public Fish {
public:
template< class AMOUNT >
void eat( AMOUNT amount) const {
std::cout << "I eat like a goldfish!" << std::endl;
}
virtual ~GoldFish() {
}
};
class OtherAnimal : public Animal {
virtual ~OtherAnimal() {
}
};
int main() {
std::vector<Animal*> animals;
animals.push_back(new Animal());
animals.push_back(new Wolf());
animals.push_back(new Fish());
animals.push_back(new GoldFish());
animals.push_back(new OtherAnimal());
for (std::vector<Animal*>::const_iterator it = animals.begin(); it != animals.end(); ++it) {
(*it)->eat();
delete *it;
}
return 0;
}
Итак, создание "Fish <Amount> foo" выглядит странно. Тем не менее, мне кажется желательным предоставить произвольное количество пищи для каждого животного.
Таким образом, я ищу решение о том, как достичь чего-то вроде
Fish bar;
bar.eat( SomeAmount food );
Это становится особенно полезным при просмотре цикла for. Можно было бы накормить определенную сумму (FoodAmount) всем разным животным (через eat() и bind1st(), например), это не может быть сделано так легко, хотя я ранен нахожу это очень интуитивным (и, следовательно, в некоторой степени "Естественно". Хотя некоторые могут сейчас возразить, что это связано с "однородным" -характерным вектором вектора, я думаю/хочу, чтобы это было возможно для достижения этого, и я действительно хотел бы знать, как, поскольку это озадачивая меня уже довольно давно...
[EDIT]
Чтобы, возможно, уточнить мотивацию моего вопроса, я хочу запрограммировать класс Exporter и дать от него разные, более специализированные классы. В то время как класс Exporter верхнего уровня, как правило, только для косметического/структурного назначения, выводится класс GraphExporter, который должен снова служить базовым классом для еще более специализированного экспорта. Однако, подобно примеру Animal, я хотел бы иметь возможность определять GraphExporter * даже на специализированных/производных классах (например, на SpecialGraphExplorer), но при вызове "write (out_file)" он должен вызывать соответствующую функцию-член для SpecialGraphExporter of GraphExporter:: write (out_file).
Возможно, это делает мою ситуацию и намерения более ясными.
Бест,
Тень