具有多态性的多重保护继承

时间:2015-01-04 15:49:52

标签: c++ inheritance polymorphism protected

我有一个关于受保护函数和多态的多重继承的问题。 描述它很难,所以我希望它足够清楚。

说我有三个班级:

class baseClass
{
 protected:
    virtual int function() = 0;
}; 


class derived_A:public baseClass
{
  int function()
    {
      //implementation 1
    };
};


class derived_B:public baseClass
{
   int function()
     {
       //implementation 2
     };
 };


class derived_C:public derived_A, public derived_B
{
  baseClass ** p_arr; //array of pointers of baseClass kind (polymorphism)
  int x=0;

  for (int i=0; i<arraySize; i++) // array size = many classes like derived_A, derived_B...
  {
     x = p_arr[i]->function(); //I already have function that builds this array
                               //it is not the question so I didn't put it here.
     // process x
   }

};

最后我的问题是 - 如何从function()类(for循环内)访问“受保护的”derived_C? 我有点困惑......并且很乐意解释。

感谢。

2 个答案:

答案 0 :(得分:2)

当C ++允许访问protected成员时,只有对象的成员(如上所述herehere)。代码x = p_arr[i]->function()尝试在另一个对象中调用一个方法,因此编译器会抱怨。

要修复您的代码,您可以公开function,或向friend添加baseClass声明,如下所示:

class baseClass
{
 public:
    virtual int function() = 0;
}; 

或者

class baseClass
{
 protected:
    friend class derived_C;
    virtual int function() = 0;
}; 

但是,要保留protected访问权限而不提及基类中派生类的名称,可以通过向基类添加static访问器函数来修复代码:

class baseClass
{
 protected:
    virtual int function() = 0;
    static int call_the_function_on_object(baseClass& obj) {return obj.function();}
}; 

以这种方式使用它(在派生类中):

x = call_the_function_on_object(*p_arr[i]);

您也可以为访问者函数指定相同的名称,但是,如果derived_C覆盖虚拟方法,它将隐藏访问者函数。您可以通过明确引用基类来解决这个问题:

class baseClass
{
 protected:
    virtual int function() = 0;
    static int function(baseClass& obj) {return obj.function();}
}; 

...
class derived_C:public derived_A, public derived_B
{
    ...
        x = baseClass::function(*p_arr[i]);
    ...
}

答案 1 :(得分:1)

在这种情况下,function()在派生类中是私有的。因此,从derived_C开始,您无法直接访问该功能。

但是,如果你愿意这样做public/protected。然后你可以使用: -

derived_C dc;
dc.derived_A::function();
dc.derived_B::function();