投射时共享指针不起作用?
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::x
和 B::x
是不同的对象。在 C++ 中,变量访问永远不会是多态的,因此当您访问 p->x
时,您正在访问 A::x
。 A::x
虽然从未初始化,因此您的程序的行为未定义。
您需要让派生的 class 的构造函数初始化基础 class 的对象,或者将该责任委托给基础 class 的构造函数:
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;
};
将共享指针从 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::x
和 B::x
是不同的对象。在 C++ 中,变量访问永远不会是多态的,因此当您访问 p->x
时,您正在访问 A::x
。 A::x
虽然从未初始化,因此您的程序的行为未定义。
您需要让派生的 class 的构造函数初始化基础 class 的对象,或者将该责任委托给基础 class 的构造函数:
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;
};