假设我们有以下给定代码:
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。模板化
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_
关于c++ - 强制实例化派生类型而不是基类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8288170/