首页 > 解决方案 > 投射时共享指针不起作用?

问题描述

将共享指针从 B 类转换为 A 类不起作用控制台输出不是 12(它输出 A 的 x,但我想要 B 的 x)(可能是其他内存地址)。我的代码有什么问题

#include <iostream>
#include <memory>

class A
{
public:
    int x;
};

class B : public A
{
public:
    B(){}
    B(const B*){}
    int x = 12;
};

std::shared_ptr<A> create()
{
    return std::make_shared<B>(new B);
}

int main(){

   std::shared_ptr<A> p;
   p = create();
   std::cout << p->x << std::endl;

   std::cin.get();
    return 0;
}

标签: c++shared-ptr

解决方案


A::x并且B::x是不同的对象。变量访问在 C++ 中永远不会是多态的,因此当您访问 时p->x,您正在访问A::x. A::x但是从未初始化,因此您的程序的行为是未定义的。

您需要让派生类的构造函数初始化基类的对象或将该责任委托给基类的构造函数:

class A
{
public:
    A(int x) : x{x} {}
    int x;
};

class B : public A
{
public:
    B() : A{12} {}
};

现场演示


或者,您可以包装x一个virtual访问器方法:

class A
{
public:
    virtual ~A() = default;
    virtual int x() const = 0;
};

class B
{
public:
    int x() const override
    {
        return x_;
    }
private:
    int x_ = 12;
};

现场演示


推荐阅读