c++ - 嵌套结构属性继承

标签 c++ class inheritance polymorphism virtual

我读到您可以使用继承来扩展结构。我有一个派生类,我想在其中拥有与其父类相同的结构,但扩展了更多字段。这似乎可行,但是当我从修改结构的 Parent 类调用方法时,它对 Child 结构属性没有影响。在这里,我正在尝试的一个例子:

class Parent
{
  public:

    struct info 
    {
      int a;
    };

    info data;
    virtual void main(void);

};

void Parent::main()
{
  data.a =1;
}

class Child: public Parent
{
  public:

  struct info2: public info
  {
    int b;
  };

  info2 data;
  virtual void main(void);
};

void Child::main(void)
{
  Parent::main();
  data.b = 2;
  std::cout << data.a << "\n";
  std::cout << data.b << "\n";
}

int main(void)
{
  Parent *base;
  Child derived;
  base = &derived;

  base->main();

  return 0;
}

这不是打印 1 和 2,而是打印 0 和 2。所以基本上就好像来自派生类的属性数据没有被调用 Parent::main 修改。

正确的做法是什么?我完全做错了吗?

最佳答案

你的意思是

void Child::main(void)
{
  Parent::main();
  data.b = 2;
  std::cout << Parent::data.a << "\n";
  std::cout << data.b << "\n";
}

在派生类中声明的名称data隐藏了在基类中声明的名称data。因此,您需要使用限定名称来访问父类的隐藏成员。

至于派生类的成员数据的数据成员a则没有初始化。

派生类的对象有两个数据成员data:一个是通过类型信息继承的(名称隐藏在派生类中),另一个是派生类自己的数据成员。

基类对派生类的数据成员data一无所知。

您可以在类信息中定义一个虚函数。例如

#include <iostream>
class Parent
{
  public:

    struct info 
    {
      int a;
      virtual void set( int a )
      {
        this->a = a;
      }
    };

    info data;
    virtual void main(void);

};

void Parent::main()
{
  data.set( 1 );
}

class Child: public Parent
{
  public:

  struct info2: public info
  {
    int b;
    void set( int a ) override
    {
        this->a = a;
    }
  };

  info2 data;
  virtual void main(void);
};

void Child::main(void)
{
    data.set( 3 );
  data.b = 2;
  std::cout << data.a << "\n";
  std::cout << data.b << "\n";
}

int main(void)
{
  Parent *base;
  Child derived;
  base = &derived;

  base->main();

  return 0;
}

程序输出为

3
2

关于c++ - 嵌套结构属性继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57997870/

相关文章:

c++ - 为什么与花括号分隔的初始化程序一起使用的缩小转换不会导致错误?

c++ - 在 D3D12 上获取显示器的刷新率

c++ - 在 std::map 中查找不存在的键

python - 全类异常(exception)

php - 如何获取类名和方法名?

inheritance - 从 Http 继承时没有 ConnectionBackend 的提供程序

c++ - 错误 : invalid use of non-static data member 'capacity' int data[capacity];

c++ - 重载>>输入矩阵(类)的功能不起作用

java - 从另一个类清除 JTextArea

c++ - 防止指针重新分配