簡體   English   中英

具有多態性的多重保護繼承

[英]multiple protected inheritance with polymorphism

我有一個關於受保護函數和多態的多重繼承的問題。 描述它很難,所以我希望它足夠清楚。

說我有三個班:

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
   }

};

最后我的問題是 - 如何從derived_C類(for循環內function()訪問“protected” function() )? 我有點困惑......並且很樂意解釋。

謝謝。

當C ++允許訪問protected成員時,它只對該對象的成員(如此此處所述 )。 代碼x = p_arr[i]->function()嘗試調用另一個對象中的方法,因此編譯器會抱怨。

要修復代碼,可以將function public,或者向baseClass添加一個friend聲明,如下所示:

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]);
    ...
}

在這種情況下,您的function()在派生類中是私有的。 因此,從derived_C您無法直接訪問該函數。

但是,如果您願意將其public/protected 然后你可以使用: -

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM