Принудительная реализация производного типа вместо базового типа - PullRequest
1 голос
/ 27 ноября 2011

Предположим, у нас есть следующее, данный код:

class T; // with T::~T is virtual
class S;
class E {
  void foo() {
    /* ... */
    S s;
    T* t = new T(s);
    /* ... */
    delete t;
    /* ... */
  }
};

Мы не можем изменить E.

Предположим, что у нас есть:

class S;
class A {
  class T : public ::T {
    T(S);
  }
};

Есть ли любым способом (в C ++ 03!) Мы можем заставить E создать экземпляр A::T вместо ::T в E::foo, не изменяя реализацию E::foo или E в целом?

Примечание: если действительно необходимо, было бы приемлемо сделать E наследуемым от того, что мы указываем (например, A), но я бы предпочел не делать этого.


Общее примечание: Да, это пахнет недостатком дизайна, но я принимаю осознанное решение иметь очень небольшую часть кода интеграции, которая слегка взломана, так что все остальные (больше!)детали могут быть красиво независимыми и хорошо продуманными.

1 Ответ

1 голос
/ 27 ноября 2011

Применяются два ответа - по общему признанию, оба шагают границы вашего вопроса:

1. Шаблон это

template <typename T>
class E {
  void foo() {
    /* ... */
    S s;
    T* t = new T(s);
    /* ... */
    delete t;
    /* ... */
  }
};

Технически, это не изменило реализацию E :: foo ... (если хотите, она просто определила более общую).

2. Зло Макросы

Действительно глупый метод, который будет работать даже в самых неблагоприятных обстоятельствах:

#define T A::T   // I didn't **recommend** this; it is just _a way_
...