gpt4 book ai didi

c++ - shared_ptr 的动态绑定(bind)

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:26 34 4
gpt4 key购买 nike

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

  • A 类(组件)将包含一些数据
  • class B(装饰器)派生自 I 并且还包含指向它的指针并将实现一些额外的行为。我有一个构造函数,它初始化指向某个 I(或派生的)对象的指针。

然后我希望能够构建一个 B 对象,其指针指向 A,因此,当我调用常用方法时,我调用的是 A 方法,而不是 I 方法。

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

但如果我将此指针设置为指向 Ishared_ptr 它会调用 中的方法 即使我构建它指向一个实际的A(在代码中看到B_shared 类和对象 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) 中,您保存指针本身,没有切片。

关于c++ - shared_ptr 的动态绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53495943/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com