【问题标题】:C++ inherited class has member of same nameC++ 继承类具有同名成员
【发布时间】:2011-02-07 12:52:41
【问题描述】:

在 C++ 中,您可以将成员放在基类中,将同名成员放在继承类中。

如何访问继承类中的特定类?

【问题讨论】:

  • 您应该问的问题是,为什么在同一继承层次结构中的类具有重复命名的不同成员?请参阅有效 C++ 第 33 条。
  • 如果您的问题是如何从基引用或指针访问派生方法,请添加注释。正如它所写的那样,这个问题可以用两种方式解释(所有答案只处理其中一种)

标签: c++ class base


【解决方案1】:
#include <iostream>
using namespace std;

struct Base {
    int memfcn();
};

struct Derived : Base {
    int memfcn(int);
};

int main() {
    Derived d;
    Base b;
    d.Base::memfcn();  //you can even use :: in conjunction with dot(.). This is new to me.
}

【讨论】:

    【解决方案2】:

    一种方法(在所有其他答案中已经提到)是使用限定的成员名称,例如Base::member。它可以与通过this 指针的显式访问结合使用,如果这是您的风格:this-&gt;Base::member

    另一种方法是通过显式转换为基类类型的this 指针执行访问:((Base *) this)-&gt;member

    当然,以上对this 指针的引用是在您尝试从类的某个非静态成员函数中访问该成员的假设下进行的。要从“外部”访问 if,可以将相同的技巧应用于任何其他指针(或引用):some_pointer-&gt;Base::member((Base *) some_pointer)-&gt;member

    对于数据成员,这两种方法是等效的。对于成员函数,它们可以导致与虚函数不同的结果。因此,一般情况下,应首选第一种方法。

    【讨论】:

      【解决方案3】:

      要访问基类中的隐藏成员,您必须在成员名称前加上基类名称。见下文:

      class A
      {
      protected:
         int i;
      };
      
      class B : public A
      {
      public:
         void foo( void )
         {
            int a_i = A::i;
            int b_i = i;
            int b_i_as_well = B::i;
         }
      private:
         int i;
      };
      

      【讨论】:

        【解决方案4】:

        是的。

        用类名f() 确认您的呼叫:SpecificClass::f()

        【讨论】:

          【解决方案5】:

          如果您指定名称,您将自动访问继承类中的名称。如果您的意思是如何访问基类中的那个,请使用 Base::member

          【讨论】:

            【解决方案6】:

            通过在其前面加上 classname:: 前缀。

            【讨论】:

              【解决方案7】:

              在这种情况下,您应该完全限定成员名称。

              class A
              {
              public:
                int x;
              };
              
              
              class B : public A
              {
              public:
                int x;
                B() 
                { 
                  x = 0;
                  A::x = 1;
                }
              };
              

              【讨论】:

                猜你喜欢
                • 2017-07-02
                • 2013-03-22
                • 2020-10-21
                • 2020-09-01
                • 1970-01-01
                • 1970-01-01
                • 2011-06-20
                • 2012-02-13
                • 2014-07-03
                相关资源
                最近更新 更多