【问题标题】:derive problem about c++导出关于 c++ 的问题
【发布时间】:2010-11-21 04:37:27
【问题描述】:

为什么我不能访问基类 A 的 B 类初始化列表中的成员?

   class A
    {
    public:
        explicit A(int a1):a(a1)
        {
        }
        explicit A()
        {
        }

    public:
        int a; 

    public:
        virtual int GetA()
        {
            return a;
        }
    };

    class B : public A
    {
    public:
        explicit B(int a1):a(a1) // wrong!, I have to write a = a1 in {}. or use A(a1)
        {
        }
        int GetA()
        {
            return a+1;
        }
    };

    class C : public A
    {
    public:
        explicit C(int a1):a(a1)
        {
        }
        int GetA()
        {
            return a-1;
        }
    };

【问题讨论】:

  • 我已经更改了措辞,以便问题更加具体:您无法从初始化列表中访问 A 字段,而您确实可以从构造函数主体中访问它。

标签: c++ derived-class


【解决方案1】:

A 的构造函数在 B 之前运行,并且,隐式或显式地,前者构造了 A 的所有实例,包括 a 成员。因此 B 不能在 a 上使用构造函数,因为该字段已经被构造。您尝试使用的符号表明要在 a 上使用构造函数,而此时这是不可能的。

【讨论】:

    【解决方案2】:

    要以 Alex 的回答为基础,您可以通过控制其构造来初始化基类的 "a" 成员,如下所示:

    class B : public A
    {
    public:
        explicit B(int a1) : A(a1) { }  // This initializes your inherited "a"
        ...
    };
    

    请注意,我是在构造上面的基类(大写“A”),而不是尝试直接初始化其继承的成员(小写“a”,绘图从你的例子)。

    【讨论】:

      【解决方案3】:

      要进一步构建 pilcrow 的答案,您可以通过在 B 类中覆盖它来轻松初始化 A 成员:

      class B : public A
      {
      public:
          int a; // override a
      
          explicit B(int a1) : a(a1) // works now
          {
          }
      
          ...
      };
      

      不过,我不一定会推荐这个 ;)

      【讨论】:

      • 哈!新徽章:“巴别塔”,用于扩展已经扩展的答案本身。 :)
      猜你喜欢
      • 2010-09-16
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2010-12-31
      相关资源
      最近更新 更多