【发布时间】:2016-07-21 18:48:48
【问题描述】:
我有这段代码:
struct Road_Primitive {
public:
Road_GPU_Point A;
Road_GPU_Point B;
Road_GPU_Point C;
};
struct Road_Primitive_4P : public Road_Primitive {
Road_GPU_Point D;
};
struct Road_Primitive_3P : public Road_Primitive{
};
在我的一个课程中,我有一个Road_Primitive*,它使用新的Road_Primitive_4P 或new Road_Primitive_3P 进行初始化,具体取决于其他因素。
然而,这段代码给了我一个“class Road_Primitive has no member D”:
Road_Primitive* pmtv_Prospect = new Road_Primitive_4P;
pmtv_Prospect->D.X = pch_Rightmost->GPU_Primitive->B.X;
但是,如果我用 protected 成员声明 Road_Primitve,错误会变成类似:“成员 B 无法访问”
有什么建议吗?
【问题讨论】:
-
你这里有一个错误的抽象;
D仅限 4P。Road_Primitive不知道。要么使用Road_Primitive_4P* pmtv_Prospect = new Road_Primitive_4P;而不是Road_Primitive* pmtv_Prospect = new Road_Primitive_4P;,要么在这里重新考虑你的抽象(虚拟方法等)。错误是不言自明的:class Road_Primitive has no member D,就是这样。如果将对象强制转换为超类型,则基本上“放弃”了所有子类型扩展细节。 -
但是我该如何解决我的问题呢?我不知道“X”类的实例是否会有 3P 或 4P 结构。我想在运行时决定,这取决于其他因素。
-
如果你不知道是3P还是4P,你怎么知道会有
->D会员?提示:你不知道,所以你不能使用它。使用虚拟方法来设计类来处理这个(更好的解决方案)或类型检查(更糟糕的解决方案)。另外:如果您想要一个实际的解决方案,请提供一个实际的上下文问题。如果没有周围的环境(代码、目标等)以及对您实际想要实现的目标和原因的具体描述,没有人能真正帮助您。 -
我找到了一种不使用继承的解决方法。但现在我更清楚为什么它一开始就不起作用了。谢谢。
-
如果您尽可能准确地说明您想要做什么,您会得到更好的答案。你的问题是“如果我有一个
Road_Primitive*类型的变量,我知道一个事实实际上指向Road_Primitive_4P,我如何获得D的值?”
标签: c++ inheritance struct public protected