通过多个接口访问虚拟功能
Virtual Function access through multiple interfaces
我刚刚偶然发现一个编译错误,我想知道为什么会发生这种情况
代码:
struct Foo1
{
virtual int foo() = 0;
};
struct Foo2 : Foo1
{
virtual int foo(int i) = 0;
};
struct Bar : public Foo2
{
virtual int foo() { return 0; }
virtual int foo(int i) { return i; }
};
int main() {
Bar b;
Foo2* f2 = &b;
b.foo();
//f2->foo(); // this gives an error
return 0;
}
gcc 4.8.1上的错误是
错误:没有用于调用"Foo2::foo(("的匹配函数
我想知道为什么编译器看不到Foo1::foo
函数?我知道我可以通过将using Foo1::foo
添加到Foo2
类来解决这个问题,但有人能给我一个标准的参考吗?为什么编译器不能自己找到函数?
来自N3797
3.3.10/3名称隐藏
在成员函数定义中,块范围内的名称声明隐藏了具有相同名称的类的成员的声明;见3.3.7派生类中成员的声明(第10条(隐藏了同名基类成员的声明。参见10.2。
所以Foo2::foo()
隐藏了Foo1::foo()
。
派生类中的foo
隐藏具有基类不同签名的foo
。
要说您希望包含基的重载,您需要向Foo2
:添加using
声明
struct Foo2 : Foo1
{
using Foo1::foo;
virtual int foo(int i) = 0;
};
相关文章:
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 从纯虚拟类 (A) 派生的指针无法访问来自纯类 (B) 的重载方法
- 使(虚拟)函数在大多数派生类中无法访问中间基类中可访问,定义良好?
- 当键是虚拟继承中涉及的基类指针时,对 std::unordered_map 项的访问崩溃
- C++ 不明确访问 - 虚拟继承
- C++继承从基类指针访问派生类中的非虚拟函数
- 重写另一个类中的虚拟方法以在 C++ 中访问其成员
- 从两个不同类继承的非虚拟基类的访问成员
- 为什么基指针可以访问虚拟函数中的派生成员变量
- 可编程访问正确的虚拟班级儿童
- 通过在基类中虚拟调用派生类中的函数来访问派生类中的函数
- 通过指针访问虚拟类
- 为什么我可以访问已删除但在C++中具有虚拟析构函数的对象?
- 确定范围是访问虚拟功能的合法方式吗?
- C++11 纯虚拟类的朋友无法访问私有方法
- 我明白为什么,但是虚拟函数/VTable 究竟如何允许通过指针访问正确的函数?
- 访问C 中的Overriden Parent虚拟方法
- 访问虚拟成员函数的已编译代码
- 通过多个接口访问虚拟功能