虚类中含有虚函数的问题 还是又歧义的接口

allen0228 2008-12-01 05:28:08
#include<iostream>
using namespace std;

class base{
public:
virtual void a(){cout<<"a() in base\n";}
virtual void b(){cout<<"b() in base\n";}
virtual void c(){cout<<"c() in base\n";}
virtual void d(){cout<<"d() in base\n";}
virtual void e(){cout<<"e() in base\n";}
virtual void f(){cout<<"f() in base\n";}
};

class A:virtual public base{
public:
virtual void a(){cout<<"a() in A\n";}
virtual void b(){cout<<"b() in A\n";}
virtual void f(){cout<<"f() in A\n";}
};

class B:virtual public base{
public:
virtual void a(){cout<<"a() in B\n";}
virtual void b(){cout<<"b() in B\n";}
virtual void c(){cout<<"c() in B\n";}
};

class C:public A,public B{
public:
virtual void a(){cout<<"a() in C\n";}
virtual void d(){cout<<"d() in C\n";}
};

void main()
{
C cc;
base *pa = &cc;
pa->a();
pa->b();
pa->c();
pa->d();
pa->e();
pa->f();
}


错误描述
--------------------Configuration: ex539 - Win32 Debug--------------------
Compiling...
ex539.cpp
E:\c++\ex539.cpp(32) : error C2250: 'C' : ambiguous inheritance of 'A::b'
E:\c++\ex539.cpp(14) : see declaration of 'A'
E:\c++\ex539.cpp(32) : error C2250: 'C' : ambiguous inheritance of 'B::b'
E:\c++\ex539.cpp(21) : see declaration of 'B'
E:\c++\ex539.cpp(32) : warning C4250: 'C' : inherits 'B::c' via dominance
E:\c++\ex539.cpp(25) : see declaration of 'c'
E:\c++\ex539.cpp(32) : warning C4250: 'C' : inherits 'A::f' via dominance
E:\c++\ex539.cpp(18) : see declaration of 'f'
Error executing cl.exe.

ex539.exe - 2 error(s), 2 warning(s)
...全文
132 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lq651659889 2008-12-01
  • 打赏
  • 举报
回复
关注
zgy1353246 2008-12-01
  • 打赏
  • 举报
回复
学习了
nullah 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lann64 的回复:]
这里是设计意图的问题。
其中b()函数在A、B里都重写过,那么继承到C类时,希望是哪个b()呢?

这里要么去掉一个,要么在C里再重写b()。

C/C++ code#include<iostream>
using namespace std;

class base{
public:
virtual void a(){cout<<"a() in base\n";}
virtual void b(){cout<<"b() in base\n";}
virtual void c(){cout<<"c() in base\n";}
virtual void d(){cout<<"…
[/Quote]
up
lann64 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 suiye 的回复:]
还是有点不太明白
这样的话 为何还有warning
--------------------Configuration: ex539 - Win32 Debug--------------------
Compiling...
ex539.cpp
E:\c++\ex539.cpp(33) : warning C4250: 'C' : inherits 'B::c' via dominance
E:\c++\ex539.cpp(25) : see declaration of 'c'
E:\c++\ex539.cpp(33) : warning C4250: 'C' : inherits 'A::f' via dominance
E:\c++\ex539.cpp(18) : see decla…
[/Quote]
是的,c()和f()还是隐含着二义的,虽然一个是来自直接父类、一个是来自父类的父类
luojc714 2008-12-01
  • 打赏
  • 举报
回复
不懂,顶一个!
allen0228 2008-12-01
  • 打赏
  • 举报
回复
还是有点不太明白
这样的话 为何还有warning
--------------------Configuration: ex539 - Win32 Debug--------------------
Compiling...
ex539.cpp
E:\c++\ex539.cpp(33) : warning C4250: 'C' : inherits 'B::c' via dominance
E:\c++\ex539.cpp(25) : see declaration of 'c'
E:\c++\ex539.cpp(33) : warning C4250: 'C' : inherits 'A::f' via dominance
E:\c++\ex539.cpp(18) : see declaration of 'f'
Linking...

ex539.exe - 0 error(s), 2 warning(s)
lann64 2008-12-01
  • 打赏
  • 举报
回复
这里是设计意图的问题。
其中b()函数在A、B里都重写过,那么继承到C类时,希望是哪个b()呢?

这里要么去掉一个,要么在C里再重写b()。
#include<iostream>
using namespace std;

class base{
public:
virtual void a(){cout<<"a() in base\n";}
virtual void b(){cout<<"b() in base\n";}
virtual void c(){cout<<"c() in base\n";}
virtual void d(){cout<<"d() in base\n";}
virtual void e(){cout<<"e() in base\n";}
virtual void f(){cout<<"f() in base\n";}
};

class A:virtual public base{
public:
virtual void a(){cout<<"a() in A\n";}
virtual void b(){cout<<"b() in A\n";}
virtual void f(){cout<<"f() in A\n";}
};

class B:virtual public base{
public:
virtual void a(){cout<<"a() in B\n";}
virtual void b(){cout<<"b() in B\n";}
virtual void c(){cout<<"c() in B\n";}
};

class C:public A,public B{
public:
virtual void a(){cout<<"a() in C\n";}
virtual void b(){cout<<"b() in C\n";} //这样
virtual void d(){cout<<"d() in C\n";}
};

int main()
{
C cc;
base *pa = &cc;
pa->a();
pa->b();
pa->c();
pa->d();
pa->e();
pa->f();
}
zhaohongbo83 2008-12-01
  • 打赏
  • 举报
回复
这个要好好的看下
allen0228 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 yshuise 的回复:]
是的
[/Quote]

啥意思啊 怎么解决上面的错误啊
yshuise 2008-12-01
  • 打赏
  • 举报
回复
是的
allen0228 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zzq0406 的回复:]
这是不是就是所谓的路径二 意啊!
[/Quote]
yes 这个是多基派生中虚函数的二义性
zzq0406 2008-12-01
  • 打赏
  • 举报
回复
这是不是就是所谓的路径二 意啊!

65,211

社区成员

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

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