Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享指针不是';铸造时不工作?_C++_Shared Ptr - Fatal编程技术网

C++ 共享指针不是';铸造时不工作?

C++ 共享指针不是';铸造时不工作?,c++,shared-ptr,C++,Shared Ptr,将共享指针从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>

将共享指针从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;
}
#包括
#包括
甲级
{
公众:
int x;
};
B类:公共A
{
公众:
B(){}
B(常数B*){}
int x=12;
};
std::shared_ptr create()
{
返回标准::使_共享(新B);
}
int main(){
std::共享的ptr p;
p=创建();

STD:CXP<代码> A::代码> B::X/<代码>是不同的对象。变量访问在C++中是不多态的,所以当你访问<代码> P>X X/Cube >时,你访问的是代码> A::X/Cuth>。<代码>::X/COM>从未初始化,所以程序的行为是未定义的。< /P> 您需要让派生类的构造函数初始化基类的对象,或者将该职责委托给基类的构造函数:

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

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


或者,您可以将
x
包装在
virtual
accessor方法中:

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

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

您在
A
中的
x
从未初始化。但我希望它指向B的xUN与您询问的问题相关,但您正在泄漏
B
对象。通常,
std::make_shared(新T)
几乎总是错误的。在派生类中使用与基类中的成员变量同名的成员变量总是一个坏主意。这里您正在体验原因。在这种情况下,每个B实例都有两个同名的变量,
B::x
a::x
,您认为您的代码应该打印
B::x
,但是t它实际打印
A::x