Как мне получить эквивалент затенения типов производным классом?

Я хотел бы написать что-то вроде следующего:

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 ++. Что мне делать вместо этого?

-7

Решение

Итак, если это всего лишь мысленный эксперимент, то ответ «Вы не можете этого сделать».

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

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);

и использовать его в общем виде. Шаблоны не дают такой гибкости (в этом примере, конечно, было бы возможно создать какое-то шаблонное решение, которое также имеет базовый класс, и тогда оба решения более или менее идентичны)

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

2

Другие решения


По вопросам рекламы [email protected]