C ++:访问祖父母方法

时间:2011-01-15 23:30:58

标签: c++ inheritance polymorphism overloading

为什么这不起作用,什么是好的选择?

class Grandparent
{
    void DoSomething( int number );
};

class Parent : Grandparent
{
};

class Child : Parent
{
    void DoSomething()
    {
        Grandparent::DoSomething( 10 ); // Does not work.
        Parent::DoSomething( 10 ); // Does not work.
    }
};

4 个答案:

答案 0 :(得分:11)

class Grandparent
{
protected:
    void DoSomething( int number );
};

class Parent : protected Grandparent
{
};

class Child : Parent
{
    void DoSomething()
    {
        Grandparent::DoSomething( 10 ); //Now it works
        Parent::DoSomething( 10 ); // Now it works.
    }
};

至少需要看起来像这样。在使用类时,默认情况下是私有的,包括子类。

http://codepad.org/xRhc5ig4

有一个完整的例子可以编译和运行。

答案 1 :(得分:0)

我猜你的代码没有编译 - 并且错误的主要来源缺少方法Child::DoSomething()的返回类型说明符。

答案 2 :(得分:0)

class Grandparent
{
    public:
    void DoSomething( int number ){
        cout<<number;
    }
};

class Parent : public Grandparent
{
    public:
    void DoSomething(int x){
        cout<<x<<'\n';
    }
};

class Child : public Parent
{
    public:
    void DoSomething()
    {
        Grandparent::DoSomething( 10 ); // works.
        Parent::DoSomething( 10 ); // works.
    }
};

c ++中的默认继承类型为private,而C ++中的默认成员函数访问说明符为Private。因此,在任何情况下都不能访问GrandParent类的私有成员。您已将GrandParent的DoSomething()设置为公共或受保护的。然后提及适当的继承类型。

答案 3 :(得分:0)

(1)是的,当我们使用public或protected访问修饰符继承继承类时,我们只能访问派生类中的祖父母成员。

(2)被声明为protected的基类成员在该类外部无法访问,但是该类的任何派生类都可以访问它们。当您通过public或protected访问修饰符继承基类的受保护成员时,该数据成员访问说明符将在派生类中得到保护。

(3)默认情况下,访问修饰符在C ++中是私有的,继承在您的给定示例中。由于您尝试访问子类中基类的私有成员,因此必然会产生编译时错误。请也阅读下一点。

(4)声明为私有的基类成员当然会继承到派生类。但是,无论继承时使用了哪种访问修饰符,都无法访问它们。可用性与可访问性有关。基类的私有成员可用于后续派生类,但不可访问。在私有继承基类之后,我们可以使用sizeof(派生类对象)运算符进行检查。

让我们讨论另一件事。我们如何访问基类的私有成员? 好吧,我们可以通过使用朋友函数和指针来做到这一点。但是,在基类中声明Friend函数取决于该基类的创建者。所以,我们不会在这篇文章中谈论它。

class Base
{
  private : 
           int x1,x2;
};

class Derived : public Base
{
     public : 
              int x3;
              void display(int *ptr)
              {
                   cout << "the value of x1 = " << *(ptr) << endl;
                   cout << "the value of x2 = " << *(ptr+1) << endl;
                   cout << "the value of x3 = " << *(ptr+2) << endl;
              }
};

int main()
{
    Derived d;
    int *ptr = (int *)&d.x3; // typecasting 

    *ptr = 3; // setting x3 as 3
     ptr--;
     
    *ptr = 2; // setting x2 as 2
     ptr--;
 
    *ptr = 1; // setting x1 as 1
     ptr--;

     d.display(ptr);
     return 0;
}

我们已经成功访问​​了基类的私有成员。

我想分享的另一件事是:如果我们有一个虚拟的Grand Parent类,我们可以直接从子类中调用Grand Parent构造函数。但通常不允许直接调用祖父母构造函数,而必须通过父类进行调用。仅在使用virtual关键字时允许。