【问题标题】: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];这是不可能的。 ?

标签: c++ class struct


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多