gpt4 book ai didi

c++ - 多态性和 shared_ptr 成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:18 25 4
gpt4 key购买 nike

测试多态性 & 虚函数 & shared_ptr,我试图理解以下最小示例描述的情况。

class B{
public:
// Definition of class B
virtual void someBMethod(){
// Make a burger
};
};

class C : public B {
public:
// Definition of class C
void someBMethod(){
// Make a pizza
};
};

class A{
public:
A(B& SomeB) : Member(std::make_shared<B>(SomeB)){};
std::shared_ptr<B> Member;
};

现在,我们基本上可以拥有

int main(){
C SomeC;
A SomeA(SomeC);
A.Member->someBMethod(); // someBMethod from B is being executed.
};

除非我没有将我的实际代码中的一些错误包含到最小示例中,否则我认为 SomeC被切割成 B , 或至少 someBMethod来自 B在最后一行被调​​用。

问题:初始化Member的正确方法应该是什么?以这样的方式,方法 someBMethod来自 C被调用?

最佳答案

您正在执行 slicing调用std::make_shared<B>(SomeB)这将构造一个指向 B 类型的对象的 shared_ptr。并使用 B 上的复制构造函数构造该对象:B::B(const B& b)切掉所有关于 SomeB 的 C-ness 的信息.

将 A 更改为:

class A{
public:
A(const std::shared_ptr<B>& pB) : pMember(pB) {}
std::shared_ptr<B> pMember;
};

主要内容:

int main(){
A SomeA(std::make_shared<C>());
A.pMember->someBMethod(); // someBMethod from C is being executed.
}

关于c++ - 多态性和 shared_ptr 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261375/

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