我正在调试一些较大代码中的问题,并意识到智能指针及其多态属性有些奇怪。通过这个简单的例子可以很好地理解这一点:
#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++ - 智能指针与哑指针 : polymorphism behavior oddity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23303535/