gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:37:26 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com