具有多态性的多重保护继承
multiple protected inheritance with polymorphism
我有一个关于受保护函数的多重继承和多态性的问题。
很难描述它,所以我希望它足够清楚。
假设我有三个 classes:
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
class(在 for 循环内)访问 "protected" function()
?
我有点困惑...很乐意为您解释。
谢谢。
在这种情况下,您的 function()
在派生 类 中是私有的。因此,从 derived_C
您不能直接访问该函数。
不过,如果你愿意的话public/protected
。然后你可以使用:-
derived_C dc;
dc.derived_A::function();
dc.derived_B::function();
当 C++ 允许访问 protected
成员时,它仅允许访问 this 对象的成员(如前所述 here and here)。代码 x = p_arr[i]->function()
试图调用另一个对象中的方法,因此编译器会报错。
要修复您的代码,您可以创建 function
public,或将 friend
声明添加到 baseClass
,如下所示:
class baseClass
{
public:
virtual int function() = 0;
};
或
class baseClass
{
protected:
friend class derived_C;
virtual int function() = 0;
};
但是,要保留 protected
访问权限并且不在基 class 中提及派生 class 的名称,您可以通过添加 static
基数 class:
的访问函数
class baseClass
{
protected:
virtual int function() = 0;
static int call_the_function_on_object(baseClass& obj) {return obj.function();}
};
这样使用它(在派生的 class 中):
x = call_the_function_on_object(*p_arr[i]);
您也可以为访问器函数指定相同的名称,但是,如果您的 derived_C
重写虚方法,它将隐藏访问器函数。您可以通过显式引用基础 class 来解决此问题:
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]);
...
}
我有一个关于受保护函数的多重继承和多态性的问题。 很难描述它,所以我希望它足够清楚。
假设我有三个 classes:
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
class(在 for 循环内)访问 "protected" function()
?
我有点困惑...很乐意为您解释。
谢谢。
在这种情况下,您的 function()
在派生 类 中是私有的。因此,从 derived_C
您不能直接访问该函数。
不过,如果你愿意的话public/protected
。然后你可以使用:-
derived_C dc;
dc.derived_A::function();
dc.derived_B::function();
当 C++ 允许访问 protected
成员时,它仅允许访问 this 对象的成员(如前所述 here and here)。代码 x = p_arr[i]->function()
试图调用另一个对象中的方法,因此编译器会报错。
要修复您的代码,您可以创建 function
public,或将 friend
声明添加到 baseClass
,如下所示:
class baseClass
{
public:
virtual int function() = 0;
};
或
class baseClass
{
protected:
friend class derived_C;
virtual int function() = 0;
};
但是,要保留 protected
访问权限并且不在基 class 中提及派生 class 的名称,您可以通过添加 static
基数 class:
class baseClass
{
protected:
virtual int function() = 0;
static int call_the_function_on_object(baseClass& obj) {return obj.function();}
};
这样使用它(在派生的 class 中):
x = call_the_function_on_object(*p_arr[i]);
您也可以为访问器函数指定相同的名称,但是,如果您的 derived_C
重写虚方法,它将隐藏访问器函数。您可以通过显式引用基础 class 来解决此问题:
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]);
...
}