c++ - 智能指针与哑指针 : polymorphism behavior oddity

标签 c++ pointers c++11 polymorphism smart-pointers

我正在调试一些较大代码中的问题,并意识到智能指针及其多态属性有些奇怪。通过这个简单的例子可以很好地理解这一点:

#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;

p1make_shared 的返回值根本不指向 b

关于c++ - 智能指针与哑指针 : polymorphism behavior oddity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23303535/

相关文章:

c++ - 最令人烦恼的解析和指针间接/解引用

c - 不同的指针是否被认为是不同的数据类型?

c++ - 如何修改函数中的字符串?

c++ - 访问基类的私有(private)变量时派生类出错

c++ - 是否可以在 c/c++ 中将 8 个字符(每个 1 字节)存储在 double 类型(8 字节)的变量中?

c++ - STL 容器作为模板参数

c++ - 表达式模板 - 无法专门化函数模板

c++ - 在 operator()() 中对具有状态和两个参数的函数对象使用 boost bind

c++ - 命名空间或类中的实用程序函数?

c++ - Win32 GDI 画一个圆?