c – 智能指针与哑指针:多态行为奇怪

c – 智能指针与哑指针:多态行为奇怪,第1张

概述我在一些更大的代码中调试了一个问题,并且发现了一些关于智能指针及其多态属性的奇怪之处.通过简单的示例可以很好地看到这一点: #include <iostream>#include <memory>using namespace std;class A {public: virtual void who() {cout << "I am class A" << endl; };}; 我在一些更大的代码中调试了一个问题,并且发现了一些关于智能指针及其多态属性的奇怪之处.通过简单的示例可以很好地看到这一点:

#include <iostream>#include <memory>using namespace std;class A {public:  virtual voID who() {cout << "I am class A" << endl; };}; class B : public A{public:  voID who() {cout << "I am class B" << endl; };}; int main(int argc,char *argv[]){  B b;    A * aptr = &b;  aptr->who(); //Output: I am class B  B * bptr = &b;  bptr->who(); //Output: I am class B  shared_ptr<A> sptr;  sptr = make_shared<A>(b);  sptr->who(); //Output: I am class A  sptr = make_shared<B>(b);  sptr->who(); //Output: I am class B  return 0;}

前两个输出对我来说很有意义,但是当我初始化的唯一对象是B类时,为什么我可以访问A中定义的成员函数(参见第三个输出)?从某种意义上说,这是一个很好的技巧,可以访问派生类型对象的基类成员.不过,这对我来说仍然有点怪异……

任何人都可以解释为什么这种行为可以使用智能指针而不是常规指针?

解决方法 std :: make_shared总是创建一个全新的对象.那是,

sptr = make_shared<A>(b);

更像是

A* p1 = new A(b);

而不是喜欢

A* p2 = &b;

p1和make_shared的返回值根本不指向b.

总结

以上是内存溢出为你收集整理的c – 智能指针与哑指针:多态行为奇怪全部内容,希望文章能够帮你解决c – 智能指针与哑指针:多态行为奇怪所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222427.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存