强制派生类型而不是基类型的实例化

时间:2011-11-27 19:01:20

标签: c++ polymorphism code-injection c++03

假设我们有以下给定代码:

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中!)我们可以强制EA::T中实例化::T而不是E::foo ,一般不改变E::fooE的实施?

注意:如果确实有必要,可以接受E继承我们指定的内容(例如A),但我不愿意这样做。


一般说明:是的,这闻起来像是一个设计缺陷,但是我做出了一个很有意思的决定,即只有一小部分集成代码被轻微入侵,所以其他所有(较大的!)部分都可以完美独立并且精心设计。

1 个答案:

答案 0 :(得分:1)

两个答案都适用 - 诚然,两者都是你问题的边界:

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_