c++ - 投射时共享指针不起作用?
问题描述
将共享指针从 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;
}
解决方案
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;
};
推荐阅读
- python - 如何指定 Django 后端?
- java - JDK 10 中支持的计算字符串宽度(像素)的方法是什么
- python-3.x - 使用 ORTools 实现自定义酸洗代码
- kubernetes - 无法在 Kubernetes 上的 Heron 上部署拓扑
- apache-spark - PySpark - 在镶木地板读取后优化分区数
- apache - 如何在 SOLR 中搜索包含 [ 和/或 ] 的字段?
- symfony - 如何获取当前登录的角色 symfony?
- r - 如何在一定时间后触发情节悬停?
- python - 无法在 keras 中定义自定义损失函数
- java - 更新后检索数据库列的值