这个报错是什么意思

li4c 2014-10-27 05:00:50
/*************************************************************************
> File Name: cthread.cpp
> Author: Jukay
> Mail: hellojukay@gmail.com
> Created Time: 2014年10月27日 星期一 16时24分41秒
************************************************************************/

#include<iostream>
#include<string>
using namespace std;

class CBase
{
public:
string id;
};

class CDeriva1 : public CBase
{
public:
void show1()
{
cout<< "CDerival: " << id << endl;
}
};

class CDeriva2 : public CBase
{
public:
void show2()
{
cout<< "CDerival2: " << id << endl;
}
};

class CSon : public CDeriva2, public CDeriva1 {}


int main()
{
CSon s;
s.CDeriva1::id = "wd8503026";
s.CDeriva2::id = "wd8503027";
s.CBase::id = "wd8503025";
s.show1();
s.show2();
cout<< "BASE: " << s.CBase::id << endl;

return 0;
}

下面没是报错信息
请按 ENTER 或其它命令继续
cthread.cpp: In function ‘int main()’:
cthread.cpp:44:11: error: ‘CBase’ is an ambiguous base of ‘CSon’
s.CBase::id = "wd8503025";
^
cthread.cpp:47:30: error: ‘CBase’ is an ambiguous base of ‘CSon’
cout<< "BASE: " << s.CBase::id << endl;
^

Shell 已返回1
...全文
176 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻夢之葉 2014-10-27
  • 打赏
  • 举报
回复

#include<iostream>
#include<string>
using namespace std;

class CBase
{
	public:
		string id;
};

class CDeriva1 : virtual public CBase /*virtual  */
{
	public:
		void show1()
		{
			cout<< "CDerival: " << id << endl;
		}
};

class CDeriva2 : virtual public CBase  /*virtual  */
{
	public:
		void show2()
		{
			cout<< "CDerival2: " << id << endl;
		}
};

class CSon : public CDeriva2, public CDeriva1 {}; /* ; */


int main()
{
	CSon s;
	s.CDeriva1::id = "wd8503026";
	s.CDeriva2::id = "wd8503027";
	s.CBase::id = "wd8503025";
	s.show1();
	s.show2();
	cout<< "BASE: " << s.CBase::id << endl;

	return 0;
}
li4c 2014-10-27
  • 打赏
  • 举报
回复
引用 1 楼 jianwen0529 的回复:
CDeriva1 和CDeriva2 使用虚继承可解决你的错误! 因为继承的时候都各自有一个CBase::id的副本,CSon分不清应该使用哪一个 所以需要使用虚继承来使其只有一个副本! class CDeriva1 : virtual public CBase
按照你说的,改了还是报错啊
请按 ENTER 或其它命令继续
cthread.cpp:28:1: error: expected class-name before ‘{’ token
 {
 ^
cthread.cpp: In member function ‘void CDeriva2::show2()’:
cthread.cpp:32:28: error: ‘id’ was not declared in this scope
    cout<< "CDerival2: " << id << endl;
                            ^
cthread.cpp: In function ‘int main()’:
cthread.cpp:43:14: error: ‘class CDeriva2’ has no member named ‘id’
  s.CDeriva2::id = "wd8503027";
              ^

Shell 已返回1
幻夢之葉 2014-10-27
  • 打赏
  • 举报
回复
CDeriva1 和CDeriva2 使用虚继承可解决你的错误! 因为继承的时候都各自有一个CBase::id的副本,CSon分不清应该使用哪一个 所以需要使用虚继承来使其只有一个副本! class CDeriva1 : virtual public CBase

64,682

社区成员

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

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