如何在使用继承的类成员结构中添加新条目
Posted
技术标签:
【中文标题】如何在使用继承的类成员结构中添加新条目【英文标题】:how to add new entries in struct which is member of class using inheritance 【发布时间】:2017-03-29 12:31:12 【问题描述】:class A
public:
typedef struct st
int x;
int y;
st;
;
我有一个类 A,它的结构是公共成员变量。我想在上面的 struct st 中添加一些新条目。我使用了继承。是否可以在不更改名称 (st) 的情况下在该结构中添加新条目。
class B:public A
;
请帮帮我。
【问题讨论】:
继续上面的问题,我还有一个疑问。为什么 B::st* obj = NULL; obj = 新 A::st [10];这是不可能的。 ? 【参考方案1】:一个类型在整个程序中始终保持不变。 A::st
有成员 x
和 y
。不多也不少——不管A
可能有任何子类。并且任何类型都不能与另一个类型同名(在同一个命名空间内)。
但是,正如您可以通过创建子类 B
来扩展类 A
一样,您也可以通过创建子类来扩展类 A::st
。如果您愿意,您可以将A::st
的子类声明为B
的成员类,如下所示:
class B:public A
struct st : A::st
int z;
;
;
现在,B::st
是A::st
的子类,并将B::A::st
隐藏在B
的命名空间中。
【讨论】:
继续上面的问题,我还有一个疑问。为什么 B::st* obj = NULL; obj = 新 A::st [10];这是不可能的。 ? @Spartacus 正确。指向父级的指针不能隐式转换为指向派生的指针。【参考方案2】:您不能在 A 中的原始结构中添加其他成员(顺便说一句:为什么使用 C 风格的 typedef?您在 C++ 中根本不需要它...)。
你唯一能做的就是通过创建一个新的数据类型在 B 中扩展你的结构:
class A
public:
struct st
int x;
int y;
;
;
class B : public A
public:
struct st : A::st
int z;
;
;
但是请注意,这些是不同的数据类型,在某些情况下您可能会面临类型擦除的风险:
B::st instance;
A::st& reference = instance; // OK
A::st* pointer = &instance; // OK
A::st anotherInstance = instance; // works, but z gets erased!!!
【讨论】:
【参考方案3】:如果我正确理解您的问题,是的,您可以在 B
内扩展 st
。在B
中添加一个继承自A::st
的内部结构。
https://godbolt.org/g/sWfYWY
class A
public:
struct St
int x;
int y;
;
St st;
;
class B : public A
public:
struct St : public A::St
int z;
;
St st;
;
int main()
A a;
a.st.x = 1;
a.st.y = 2;
B b;
b.st.x = 3;
b.st.y = 4;
b.st.z = 5;
return 0;
【讨论】:
以上是关于如何在使用继承的类成员结构中添加新条目的主要内容,如果未能解决你的问题,请参考以下文章