shared_ptr 的动态绑定

Dynamic binding of shared_ptr

我正在尝试按照装饰器模式实现一些东西,但我似乎无法从 shared_ptr 获得我可以通过普通指针获得的相同 运行 时间行为。 我有一个基本的 class I (接口)和一个虚拟方法,然后我从它派生出两个 classes :

然后我希望能够构建一个 B 对象,其指针指向 A,所以当我调用常用方法时,我调用 A 而不是 个.

如果我以通常的方式在 B 中创建指针,我可以做到这一点(在代码示例中,请参阅 class B_basic 和对象 bb 主要)。

但是如果我把这个指针做成 shared_ptrI 它从 I 调用方法,即使我构建它指向一个实际的 A(代码见B_sharedclass 和对象 bs)

class I {

   public:
      virtual void method() {cout<<"I\n";}
      virtual ~I() = default;
};

class A : public I {
   public:
      virtual void method() {cout<<"A\n";}
};

class B_shared : public I {
   public:
      shared_ptr<I> shared_pointer;
      B_shared(const I& i) : shared_pointer(make_shared<I>(i)) {}
      virtual void method() { 
         cout<<"B_shared > ";

         shared_pointer->method();
      }
};

class B_basic : public I {
   public:
      I* basic_pointer;
      B_basic(I* i) : basic_pointer(i) {}
      virtual void method() { 
         cout<<"B_basic > ";

         basic_pointer->method();
      }
};


int main() { 
   A a;
   B_shared bs(a);
   B_basic bb(&a);
   bs.method(); // B_shared > I
   bb.method(); // B_basic > A
}

我做错了什么?

这是对象切片。

在下一行中,您将类型 A 的实例 i 复制到类型 I。因此原始类型 A 被分割为基本类型 I.

shared_pointer(make_shared<I>(i)) 

在原始指针版本 basic_pointer(i) 中,您保存指针本身,没有切片。