如何在使用继承的类成员结构中添加新条目

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 有成员 xy。不多也不少——不管A 可能有任何子类。并且任何类型都不能与另一个类型同名(在同一个命名空间内)。

但是,正如您可以通过创建子类 B 来扩展类 A 一样,您也可以通过创建子类来扩展类 A::st。如果您愿意,您可以将A::st 的子类声明为B 的成员类,如下所示:

class B:public A

    struct st : A::st
    
        int z;
    ;
;

现在,B::stA::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;

【讨论】:

以上是关于如何在使用继承的类成员结构中添加新条目的主要内容,如果未能解决你的问题,请参考以下文章

继承

Delphi的类和对象- 继承

如何将序列化方法添加到作为 Windows 数据结构的类成员,以便在 C++ 中与 boost 序列化一起使用

向上转换到基类时如何使用继承的类成员的值

将成员添加到从基类继承的结构

Runtime objc4-779.1 为什么不能向一个已存在的类添加成员变量?有什么办法达到相同的效果?