【问题标题】:C++ overloaded function issueC++重载函数问题
【发布时间】:2009-11-25 19:47:09
【问题描述】:

为什么编译器找不到基类函数签名?将 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++ inheritance


【解决方案1】:

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

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

using B::foo;

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

【讨论】:

  • 另外,main 不允许为空。按照 C++ 标准,它必须返回一个 int。
  • 你也可以在 B 类中将函数设为虚函数。
  • 我的问题现在符合 C++ 标准。
  • @ChrisInEdmonton:将函数设为虚拟不会解决此问题,因为 foo 的两个声明具有不同的签名。
猜你喜欢
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多