编译错误,在线等!

enrico 2009-12-12 05:02:33
A是B的父类;
C是D的父类;

A里面有一个虚函数void foo(C &c);
B里面重新实现了void foo(C &c);

E类里面有个成员A *a;然后在函数bar()里面调用了
a->foo(D(d));

编译的时候提示:
no matching function for call to `A::foo(D)'
candidates are: virtual void A::foo(C &)

但是我有看到别的地方如func(C &c)的时候,调用写func(D(d))没有报错的。

请问我的错误可能是什么原因??在线等!
...全文
134 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
go_Michael 2009-12-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 go_michael 的回复:]
C/C++ codeclass C;class D;class A
{public:virtualvoid foo(C&c)
{
cout<<"A foo"<<endl;
}
};class B :public A
{public:virtualvoid foo(C&c)
{
cout<<"B foo"<<endl;
}
};class C
{public:
C(int m)
{
val=m;
}private:int val;
};class D :public C
{public:
D(int m):C(m)
{
}
};class E
{public:void bar()
{
a->foo(D(12));
}private:
A* a;
};void main()
{
E e;
e.bar();
}

运行的时候有问题

[/Quote]

bar中没有对a赋值,a=new A;这样就好了
enrico 2009-12-12
  • 打赏
  • 举报
回复
的确如一楼所说,看来C++编译报错的确诡异
go_Michael 2009-12-12
  • 打赏
  • 举报
回复

class C;
class D;
class A
{
public:
virtual void foo(C &c)
{
cout<<"A foo"<<endl;
}
};
class B : public A
{
public:
virtual void foo(C &c)
{
cout<<"B foo"<<endl;
}
};

class C
{
public:
C(int m)
{
val=m;
}
private:
int val;
};
class D : public C
{
public:
D(int m):C(m)
{
}
};

class E
{
public:
void bar()
{
a->foo(D(12));
}
private:
A* a;
};

void main()
{
E e;
e.bar();
}


运行的时候有问题
mstlq 2009-12-12
  • 打赏
  • 举报
回复
以下代码也pass
关键部分看1楼
#include <iostream>
using namespace std;

class C
{};

class D :public C
{
public:
D(int d):d_(d){};
private:
int d_;
};

class A
{
public:
virtual void foo( C c)
{
cout<<"aa"<<endl;
};
};
class B :public A
{
public:
virtual void foo( C c)
{
cout<<"bb"<<endl;
};
};
class E
{
public:
A *a;
void bar()
{
a= new A;
int d=9;
a->foo(D(d));
return;
}
};

int main()
{
return 0;
}
arong1234 2009-12-12
  • 打赏
  • 举报
回复
我的理解D(d)生成的是一个临时D对象,而临时对象直接访问引用可能是有点让编译器害怕了,你如果定义foo为const C& c可能就没问题了
mstlq 2009-12-12
  • 打赏
  • 举报
回复
以下代码,pass……

#include <iostream>
using namespace std;

class C
{};

class D :public C
{
public:
D(int d):d_(d){};
private:
int d_;
};

class A
{
public:
virtual void foo(const C &c)
{
cout<<"aa"<<endl;
};
};
class B :public A
{
public:
virtual void foo(const C &c)
{
cout<<"bb"<<endl;
};
};
class E
{
public:
A *a;
void bar()
{
a= new A;
int d=9;
a->foo(D(d));
return;
}
};

int main()
{
return 0;
}
enrico 2009-12-12
  • 打赏
  • 举报
回复
d是参数,D(d)是用D的构造函数生成D的一个对象
healer_kx 2009-12-12
  • 打赏
  • 举报
回复
d是什么啊?
机智的呆呆 2009-12-12
  • 打赏
  • 举报
回复
a->foo(D(d)); //为啥强制转换成D类型哪,提示很明显了 找不到和A::foo(D)匹配的函数
mstlq 2009-12-12
  • 打赏
  • 举报
回复
要么void foo(const C &c);
要么void foo( C c);

64,645

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧