加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:44:10 所属栏目:百科 来源:网络整理
导读:我在一些更大的代码中调试了一个问题,并且发现了一些关于智能指针及其多态属性的奇怪之处.通过简单的示例可以很好地看到这一点: #include iostream#include memoryusing 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读