提问人:Chicoscience 提问时间:2/18/2023 最后编辑:Chicoscience 更新时间:2/18/2023 访问量:81
在 C++ 中,如何从曾经创建为子类但后来复制到超类的对象的子类中访问属性?
In C++, how to access attributes from a subclass of an object that was once created as subclass, but then copied to superclass?
问:
考虑下面的代码(注意:在受到正确的批评之后,我改写了这个问题):
#include <vector>
using std::vector;
class DataSuper {
public:
DataSuper() {}
};
class DataSub : public DataSuper {
public:
int a;
DataSub() {}
};
class Super {
public:
DataSuper data;
Super() {}
};
class Sub : public Super {
public:
Sub(DataSub i) {
data = i;
}
void test() {
// I would like to print the value of data.a
}
};
int main(int argc, char *argv[]) {
DataSub dataSub;
Super* s = new Sub(dataSub);
s->test();
delete(s);
return 0;
}
Super
有一个称为 的实例。,的子类 具有相同的对象,但它是 的实例,继承自 。DataSuper
data
Sub
Super
data
DataSub
DataSuper
从本质上讲,我想从课堂访问.我知道我可以通过 having 作为指针然后使用 来做到这一点,但不确定这是否是好的做法。data.a
Sub
data
dynamic_cast
有没有办法避免它而不作为指针?data
答:
Super::data
不是 ,但你把它当作一个。DataSub
请记住,在 C++ 中,对象类型的变量是对象。它不是引用或指针或类似的东西,除非您声明它是。 是一个,它永远不可能是其他任何东西。像你在这里那样强行指向它不会有好结果。Super::data
DataSuper
DataSub&
如果要在 your 和 classes 之间共享 a,则需要使用指针。例如:DataSub
Super
Sub
class Super
{
public:
std::unique_ptr<DataSuper> data;
Super(std::unique_ptr<DataSuper> data) : data{std::move(data)} {}
};
class Sub : public Super
{
public:
using Super::Super;
private:
// Use this if you need to treat data as a DataSub
DataSub& dataSub()
{
return static_cast<DataSub&>(*data);
}
};
int main()
{
std::unique_ptr<Super> s = std::make_unique<Sub>(std::make_unique<DataSub>());
}
如果你想避免这所需的额外分配,你可以反转所有权方向。也就是说,将非拥有指针传递给 to 的构造函数并拥有该对象:data
Sub
DataSub
Super
Sub
class Super
{
public:
Super(DataSuper* data) : data{data} {}
private:
DataSuper* data;
};
class Sub : public Super
{
public:
Sub() : Super{&data} {}
private:
DataSub data;
};
int main()
{
std::unique_ptr<Super> s = std::make_unique<Sub>();
}
请注意,这种方法比第一种方法的安全性略低,因为在初始化子对象时尚未初始化。如果你尝试使用 's 构造函数中指向的对象,你很快就会陷入未定义行为的境地。的析构函数也是如此。 在执行 的主体之前被销毁,因此尝试访问 from 的析构函数主体所指向的对象也会导致未定义的行为。Sub::data
Sub
Super
Super::data
Super
Super
Sub::data
Super::~Super
data
Super
评论
static_cast
Super::data
DataSub
DataSuper
DataSub
Sub
i
Super::data