投射时共享指针不起作用?

shared pointer isn't working when casting?

将共享指针从 B class 转换为 A class 不起作用控制台输出不是 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;
}

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

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

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

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

Live Demo


或者,您可以将 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;
};

Live Demo