我有以下代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
但是,我不能编译它,因为
错误C2247:无法访问“ Foo”,因为“ Bar”使用“ protected”来继承“ Foo”
当我使用完using并且可以直接致电操作员后,为什么这不可能呢?有什么办法吗?
如果我将继承更改为公开,那么它将起作用。
注意:这只是较大类的一个示例。我不想使用公共继承,因为我不想这样做,Foo f = Bar()因为在中Bar,我隐藏了父方法(我没有使用virtual)。
当我使用过using并且可以直接调用operator时,为什么这不可能呢?
using声明使您可以访问名称 operator[]。但这不会改变成员的类型。留下来
int &(Foo::*)(size_t)。注意Foo。
因此,要转换为声明的类型,o需要在继承树下进行转换。此转换必须检查目标类确实是从基类派生的,但这是不可访问的基类。
解决它的一种方法是提供Bar一个返回该指针的成员函数。在Bar的作用域内,该基础将可用于转换。另外,这种转换需要使用static_cast。
| 归档时间: |
|
| 查看次数: |
131 次 |
| 最近记录: |