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