考虑下面的代码(注意:经过合理的批评后,我改写了这个问题):
#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
。Super
的子类Sub
具有相同的对象data
,但它是从DataSuper
继承的DataSub
的示例。
本质上,我想从类Sub
访问data.a
,我知道我可以用data
作为指针,然后使用dynamic_cast
,但不确定这是否是一个好的实践。
有没有一种方法可以避免它没有data
作为指针?
1条答案
按热度按时间huwehgph1#
Super::data
不是DataSub
,但您将其视为DataSub
。请记住,在C++中,对象类型为 * 的变量是 * 对象。它不是引用或指针或类似的东西,除非你声明它是。
Super::data
是DataSuper
,它永远不会是其他东西。像这样强制指向DataSub&
不会有好结果。如果你想在
Super
和Sub
类之间共享一个DataSub
,你需要使用一个指针,例如:Demo
如果你想避免
data
的额外分配,你可以反转所有权的方向,也就是说,让Sub
传递一个指向DataSub
的非拥有指针给Super
的构造函数,并让Sub
拥有该对象:Demo
注意,这种方法比第一种方法稍差一些,因为
Sub
的Super
子对象初始化时Sub::data
还没有初始化,如果你试图在Super
的构造函数中使用Super::data
指向的对象,你会很快陷入未定义行为的境地,Super
的析构函数也是如此。Sub::data
在Super::~Super
的主体被执行之前被销毁,因此试图从Super
的析构函数主体访问data
所指向的对象也将导致未定义的行为。