C++ 继承 "Ignored"

C++ Inheritance "Ignored"

我有这段代码:

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_4Pnew 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,错误会变成如下内容:"Member B is inaccesible"

有什么建议吗?

嗯,class Road_Primitive 没有 任何成员 D。每个表达式都根据其所有子表达式的 声明的 类型进行解释,由编译器评估。 pmtv_Prospect 当前在执行期间的某个时刻指向 Road_Primitive_4P 这一事实并没有考虑在内——如果您通过 Road_Primitive * 访问 Road_Primitive_4P 那么您就可以访问仅适用于 class Road_Primitive.

声明的那些成员

如果您希望能够访问 Road_Primitive_4P.D,那么您必须通过(声明的)类型 Road_Primitive_4P 的值来实现。因此,你可以写

Road_Primitive_4P* pmtv_Prospect = new Road_Primitive_4P;
pmtv_Prospect->D.X = pch_Rightmost->GPU_Primitive->B.X;

当然,在那种情况下,您不能将 pmtv_Prospect 指定为指向 Road_Primitive_3P,但这才是真正的重点。如果您可以 使其指向没有成员DRoad_Primitive_3P,那么访问引用对象的D 将不安全。

struct Road_Primitive,事实上,没有一个名为 D 的成员。虽然你正在分配一个 Road_Primitive_4P,但你将它存储在一个指向 [=36 类型的指针中=], 所以当你访问 (pmtv_Prospect) 时你只能访问 Road_Primitive.

中的字段

通常当您将 child classes 的实例存储为 parent classes 时,您需要多态性和虚方法,或者其他一些告诉方式child class 指针真正指向的是哪个。

为了按照 Gaurav 的建议使用 "dynamic_cast",您的结构或 classes 需要至少有一个虚拟方法。从析构函数开始可能是个好主意:

struct Road_Primitive {
public:
    virtual ~Road_Primitive() {};
// etc.

每个 child class:

struct Road_Primitive_4P: public Road_Primitive {
public:
    virtual ~Road_Primitive_4P() {};

那么如果你有一个 Road_Primitive 指针并且想要访问它的只能在 Road_Primitive_4P[ 中访问的成员 你可以使用 dynamic_cast:

Road_Primitive_4P* temp = dynamic_cast<Road_Primitive_4P*>(pmtv_Prospect);
if (temp)  // then do something with temp->D

dynamic_cast() 将 return 0 如果 object 与您尝试转换为的类型不匹配。

还要记住,这种多态性风格通常被认为是不好的风格,因为它倾向于将 特定 的行为集中到不同的类型。使用虚拟方法通常更可取,因为特定于每种类型的行为存储在该类型的 of 定义中。