C++重载函数问题

标签 c++ inheritance

为什么编译器找不到基类函数签名?将 foo( a1 ) 更改为 B::foo( a1 ) 有效。

代码:

class A1 ;
class A2 ;

class B
{
public:
   void foo( A1* a1 ) { a1 = 0 ; }
} ;

class C : public B
{
public:
   void foo( A2* /*a2*/ )
   {
      A1* a1 = 0 ;
      foo( a1 ) ;
   }
} ;

int main()
{
   A2* a2 = 0 ;
   C c ;
   c.foo( a2 ) ;
   return 0 ;
}

编译错误(VS2008):

error C2664: 'C::foo' : cannot convert parameter 1 from 'A1 *' to 'A2 *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

最佳答案

名称 C::foo 阴影 B::foo。一旦编译器在类 C 中找到匹配的 foo,它就会停止进一步搜索。

您可以通过添加以下内容来解决您的问题:

using B::foo;

到类 C 的主体,或通过重命名类 B 中的函数。

关于C++重载函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1799497/

相关文章:

Javascript 继承和 Angular 服务

c# - 返回子类而不是父类(super class) F#

ruby - 将哈希合并到哈希子类 - 确保嵌套哈希具有子类属性

c++ - 使用 CUDA 和 Maya API 时命名空间发生冲突

python - 包装 C++ 类以在 Python 中使用

c++ - 在 C++ 中实现另一个用户堆栈

Java 通用容器类

C++ 将 'this' 指针传递给基类然后将其存储为子类的另一个基类的预期行为是什么

c++ - 规范化时避免奇怪的单应性值

c++ - 绘制可以放大/缩小的声波