代码之家  ›  专栏  ›  技术社区  ›  bdhar

从派生类对象访问重写的基类成员

  •  2
  • bdhar  · 技术社区  · 16 年前

    我有两个班:

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

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

    B b;
    

    有可能进入 A::i 使用 b ?

    5 回复  |  直到 16 年前
        1
  •  7
  •   Prasoon Saurav    16 年前

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

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

        2
  •  4
  •   Oliver Charlesworth    16 年前

    对:

    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;
    }
    
        3
  •  2
  •   Younes    16 年前

    是的,你可以。找出原因 this

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

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

    基.MyMethod()

        4
  •  2
  •   Community Mohan Dere    9 年前

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

    对于为基本成员定义新数据类型的派生类,这一点很重要,如本文所示: C++ Inheritance. Changing Object data Types

        5
  •  1
  •   Chubsdad    16 年前

    两种方式:

    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;
    }
    
    推荐文章