shared_ptr 的动态绑定
Dynamic binding of shared_ptr
我正在尝试按照装饰器模式实现一些东西,但我似乎无法从 shared_ptr 获得我可以通过普通指针获得的相同 运行 时间行为。
我有一个基本的 class I (接口)和一个虚拟方法,然后我从它派生出两个 classes :
- class A(组件)将包含一些数据
- class B (装饰器)派生自 I 并且还包含一个指向它的指针,并将实现一些额外的行为。我有一个构造函数,它初始化指向某个 I(或派生的)对象的指针。
然后我希望能够构建一个 B 对象,其指针指向 A,所以当我调用常用方法时,我调用 A 而不是 我个.
如果我以通常的方式在 B 中创建指针,我可以做到这一点(在代码示例中,请参阅 class B_basic 和对象 bb 主要)。
但是如果我把这个指针做成 shared_ptr 到 I 它从 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)
中,您保存指针本身,没有切片。
我正在尝试按照装饰器模式实现一些东西,但我似乎无法从 shared_ptr 获得我可以通过普通指针获得的相同 运行 时间行为。 我有一个基本的 class I (接口)和一个虚拟方法,然后我从它派生出两个 classes :
- class A(组件)将包含一些数据
- class B (装饰器)派生自 I 并且还包含一个指向它的指针,并将实现一些额外的行为。我有一个构造函数,它初始化指向某个 I(或派生的)对象的指针。
然后我希望能够构建一个 B 对象,其指针指向 A,所以当我调用常用方法时,我调用 A 而不是 我个.
如果我以通常的方式在 B 中创建指针,我可以做到这一点(在代码示例中,请参阅 class B_basic 和对象 bb 主要)。
但是如果我把这个指针做成 shared_ptr 到 I 它从 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)
中,您保存指针本身,没有切片。