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_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,错误会变成如下内容:"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
,但这才是真正的重点。如果您可以 使其指向没有成员D
的Road_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 定义中。
我有这段代码:
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,错误会变成如下内容:"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
,但这才是真正的重点。如果您可以 使其指向没有成员D
的Road_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 定义中。