我正在调试一些较大的代码问题,发现智能指针及其多态属性的一些奇怪之处。最好通过以下简单示例来理解:
#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;
}
前两个输出对我来说有意义,但是为什么我可以访问在 A 中定义的成员函数(见第三个输出),当我初始化的对象只是类型 B?从某种意义上说,这是一种访问派生类型对象的基类成员的好方法。然而,对我来说,这仍然有点神秘......
有人能解释为什么智能指针可以实现这种行为,而常规指针却不行吗?
aptr->who();
应该改为bptr->who();
。 - Danielsptr->A::who()
。 - aschepler