c++ - 强制实例化派生类型而不是基类型

标签 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 中!)我们可以强制 E实例化 A::T而不是 ::TE::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/

相关文章:

c++ - 作为标准,C++ 是否禁止在单个类实例中存储成员函数?

C++ - 不需要使用基本方法

c++ - 如何将对象指针与动态数组一起使用

php - 在转换为 XML 之前转义发布数据的正确方法

c++ - Lambda 丢失捕获值

C++使用不同的流读取和写入同一文件

c++ - 使用 libav/ffmpeg 将 RGB8 转换为 NV12

c++ - 具有非类型模板参数的多态性

c - 如何在 64 位进程(Windows)上正确保存和恢复线程上下文?

java - Fortify 问题 - 命令注入(inject)