假设我们有以下给定代码:
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
),但我不愿意这样做。
一般说明:是的,这闻起来像是一个设计缺陷,但是我做出了一个很有意思的决定,即只有一小部分集成代码被轻微入侵,所以其他所有(较大的!)部分都可以完美独立并且精心设计。
答案 0 :(得分:1)
两个答案都适用 - 诚然,两者都是你问题的边界:
template <typename T>
class E {
void foo() {
/* ... */
S s;
T* t = new T(s);
/* ... */
delete t;
/* ... */
}
};
现在,从技术上讲,这确实不改变了E :: foo的实现......(如果你愿意,它只是定义了一个更通用的实现)。
即使在一些最不利的情况下, 的真正 - 哑方法:
#define T A::T // I didn't **recommend** this; it is just _a way_