[英]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.