作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
测试多态性 & 虚函数 & 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/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!