【问题标题】:Accessing overridden base class member from derived class object从派生类对象访问被覆盖的基类成员
【发布时间】:2011-04-21 18:35:14
【问题描述】:

我有两个班级:

class A
{
public:
  int i;
};

class B : public A
{
public:
  int i;
};

假设我为 B 类创建了一个对象

B b;

是否可以使用b 访问A::i

【问题讨论】:

  • 你到底为什么要这么做?即使有可能也容易出错。
  • @the_drow:他想这样做是因为他的基类和派生类中的成员具有相同的变量名“i”。为什么容易出错?
  • @Als:当您的意思是b.A::i时,很容易意外访问b.i,而且仅通过查看代码也不会很明显。

标签: c++ inheritance overriding


【解决方案1】:

正如其他人回答的那样,这是可能的。 但是在您发布的示例中,基成员和派生成员是相同的,数据类型没有被覆盖。

这与为基成员定义新数据类型的派生类相关,如本文所示:C++ Inheritance. Changing Object data Types

【讨论】:

    【解决方案2】:

    两种方式:

    struct A{
        A():i(1){}
        int i;
    };
    
    struct B : A{
        B():i(0), A(){}
        int i;
    };
    
    int main(){
        B b;
        cout << b.A::i;
        cout << (static_cast<A&>(b)).i;
    }
    

    【讨论】:

      【解决方案3】:

      是的:

      int main()
      {
          B b;
      
          b.i = 3;
          b.A::i = 5;
      
          A *pA = &b;
          B *pB = &b;
          std::cout << pA->i << std::endl;
          std::cout << pB->i << std::endl;
      }
      

      【讨论】:

        【解决方案4】:

        是的,你可以。了解阅读this

        覆盖方法提供了从基类继承的成员的新实现。被覆盖声明覆盖的方法称为被覆盖的基方法。被覆盖的基方法必须与覆盖方法具有相同的签名。

        在具有重写方法的派生类中,您仍然可以使用 base 关键字访问具有相同名称的重写基方法。例如,如果您有一个虚拟方法 MyMethod(),并且在派生类上有一个覆盖方法,则可以通过调用从派生类访问该虚拟方法:

        base.MyMethod()

        【讨论】:

        • 抱歉没有看到它是 c++,我自动假设它是 C# :)。
        【解决方案5】:

        是否可以使用 b 访问 A::i?

        是的! b.A::i 怎么样? ;)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-23
          • 1970-01-01
          • 2011-01-27
          • 2016-07-31
          • 1970-01-01
          • 2018-09-18
          相关资源
          最近更新 更多