Я хотел бы написать что-то вроде следующего:
class A {
virtual typedef int foo_t;
void bar() {
cout << "foo_t is " << get_demangled_name(typeid(foo_t));
}
}
class B : A {
typedef float foo_t;
}
И для bar()
вести себя полиморфно. Но — это невозможно в C ++. Что мне делать вместо этого?
Итак, если это всего лишь мысленный эксперимент, то ответ «Вы не можете этого сделать».
Если вы действительно хотите иерархию, в которой ваши производные классы имеют разные типы, вы можете сделать что-то вроде этого:
class Base
{
public:
virtual void bar() = 0;
};
class A: public Base
{
public:
void bar() { ... do stuff here }
private:
typedef int foo_t;
};class B: public Base
{
public:
void bar() { ... do stuff here }
private:
typedef float foo_t;
};
В качестве альтернативы, если наследование не требуется:
template<typename T>
class TemplateA
{
typedef T foo_t;
void bar() { ... do stuff here ... }
}
typedef TemplateA<int> A;
typedef TemplateA<float> B;
Виртуальная функция дает то, что вы можете иметь:
vector<Base&> v;
A a;
B b;
v.push_back(a);
v.push_back(b);
и использовать его в общем виде. Шаблоны не дают такой гибкости (в этом примере, конечно, было бы возможно создать какое-то шаблонное решение, которое также имеет базовый класс, и тогда оба решения более или менее идентичны)
Все зависит от того, что ваш экспериментальный эксперимент на самом деле пытается решить — даже если это просто экспериментальный эксперимент, эти два решения будут иметь разные плюсы и минусы, в зависимости от того, как вы хотите их использовать.