用受保护的继承指向基类方法
Pointer to base class method with protected inheritance
我有此代码:
class Foo
{
public:
int x = 4;
int & operator[](size_t index) { return x; }
};
class Bar : protected Foo
{
public:
using Foo::operator[];
Bar () { x++; }
};
int main(int agrc, char ** argv)
{
typedef int &(Bar::*getOp)(size_t index);
Bar b;
auto bVal = b[4];
getOp o = &Bar::operator[];
auto bVal2 = (b.*o)(7);
}
但是,我无法编译,因为
错误c2247:'foo'无法访问,因为" bar'使用" protected'
当我使用using
并且可以直接调用操作员时,为什么这是不可能的?有什么办法吗?
如果我将继承更改为公众,则可以正常工作。
注意:这只是较大类的示例。我不想使用公共继承,因为我不想做Foo f = Bar()
,因为在Bar
中,我隐藏了父方法(我没有使用虚拟(。
当我使用使用并可以直接调用操作员时,为什么这是不可能的?
使用声明使您可以访问 name operator[]
。但这不会改变成员的类型。它留下来 int &(Foo::*)(size_t)
。注意Foo
。
因此,转换为声明的 o
的类型需要向继承树进行转换。此转换必须检查目标类的确是从基数得出的,但这是一个无法接近的基础。
围绕它的一种方法是使Bar
返回该指针的成员函数。在Bar
的范围内部,转换将可以访问基数。另外,这种转换需要static_cast
。
一旦基类Foo
无法访问,就不允许此转换。
而不是使用using Foo::operator[]
,也许这可以解决您的问题:
int& operator[](size_t index) { // now a Bar::operator[], not Foo:: anymore
return Foo::operator[](index);
}
相关文章:
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C++初始化之前派生类调用基类的方法
- 为什么派生类的实例从基类调用方法?
- 为什么允许将派生类的方法static_cast为基类的方法?
- 从基类调用继承类的方法.C++
- 我无法重写基类的方法,因为我的派生类是模板化的
- C++继承,如何在基类的方法中调用子类的方法?
- C ++中有没有办法让派生类重写基类静态方法
- 如何将模板派生类的方法提取到非模板基类中
- 将指针从派生到基类的方法的最佳方法
- 当类不需要重写从多个基继承的方法时该怎么办
- 抽象基类的派生类未正确覆盖基纯虚拟方法
- C++抽象基模板类非空方法
- CRTP:基于派生类内容的基类启用方法
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包
- SWIG:在派生类中处理基类重载方法
- 在派生类的方法中使用基类的方法
- 仅通过基类"create"方法将对象创建为共享指针