代码之家  ›  专栏  ›  技术社区  ›  CDZ

“new operator”将另一个类实例化为工厂?

  •  11
  • CDZ  · 技术社区  · 7 年前

    我试着使用 new 运算符实例化特定类,而不是后面的类 关键字。

    在我看来,这是不可能的,但让我们仔细检查一下! 此代码可编译,但主代码将其视为 Test TestImpl

    class Test
    {
    public:
      virtual int testCall() { return 0; };
    
      static void* operator new(std::size_t);
    };
    
    class TestImpl : public Test
    {
      virtual int testCall() override
      {
        return i;
      }
    
      int i = 15;
    };
    
    void* Test::operator new(size_t sz)
    {
      return ::new TestImpl();
    }
    
    void main()
    {
      Test * t = new Test(); // Call the new operator, correctly
      int i = test->testCall(); // i == 0 and not 15
    }
    
    1 回复  |  直到 7 年前
        1
  •  21
  •   songyuanyao    7 年前

    注意,对于每个 new expression ,将执行以下两项操作:

    1. operator new .
    2. 在步骤#1分配的内存上构造对象。

    操作员新建 只分配内存,不构造对象。这意味着 Test * t = new Test(); ,仍然是 Test 将在重载的 TestImpl 内部 操作员新建 ,但在 操作员新建