C++中继承关系——菱形继承

二进制浮游 2011-07-06 12:10:18
新手求教类的继承关系问题,代码如下:
#include <iostream>
using namespace std;

class Base { //基类
public:
void virtual print(void)
{
cout << "base!" <<endl;
}
};

class child1 :virtual Base {
public:
void virtual print(void)
{
cout << "child1" << endl;
}
};
class child2 :virtual Base {
public:
void virtual print(void)
{
cout << "child2" <<endl;
}
};
class child3 :public child1 , child2 {

};

int main()
{
Base base;
child1 ch1;
child2 ch2;
base.print();
ch1.print();
ch2.print();
child3 ch3;
return 0;
}
编译报错,怎么避免(不考虑在类 child3 中写print函数)?
错误提示:“错误:‘virtual void Base::print()’的最终重载在child3中不唯一”
...全文
259 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wzx19840423 的回复:]
虚拟继承不是这样用的
[/Quote]
是怎么样的?不懂,自己瞎搞的。
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
就这个结构而言,不在类 child3 中写 print 函数就没有办法避免吗,还是说这个结构本身就存在这个缺陷?
  • 打赏
  • 举报
回复
虚拟继承不是这样用的
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
额,谢谢大家了。也就是说这个设计结构本身就有问题?
就想叫yoko 2011-07-06
  • 打赏
  • 举报
回复
当你实际设计时遇到这个问题 你就会发现这不是个问题了
luciferisnotsatan 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 babilife 的回复:]

有歧义了,因为child3不知道继承哪个的print(void)

所以就不要这样设计了,或者在3里写一个print(void)
[/Quote]++
至善者善之敌 2011-07-06
  • 打赏
  • 举报
回复
有歧义了,因为child3不知道继承哪个的print(void)

所以就不要这样设计了,或者在3里写一个print(void)
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
米人= =!,自己顶下!!
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
非常感谢大家!
小时了了 2011-07-06
  • 打赏
  • 举报
回复
应该是尽量避免出现菱形继承的设计,否则问题多多。比如你在基类中定义了一个对象引用计数器,那菱形继承时最下层的派生类实际上继承了多个计数器,计数很容易就出错了。虚继承可以解决这个问题,但意味着你为了写child3而要去修改child1和child2的代码(添加虚拟继承),还会造成代码阅读和维护的困难以及虚函数表结构的变化等等。
小时了了 2011-07-06
  • 打赏
  • 举报
回复
虚继承只是用来解决多继承带来的菱形继承问题的一个语法补丁,问题多多。尽量避免使用。
楼主的问题只能在child3中重载print函数,否则ch3.print()调用哪一个函数实现呢?
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 jg121125 的回复:]
引用 14 楼 wzx19840423 的回复:
引用 13 楼 jg121125 的回复:
引用 12 楼 wzx19840423 的回复:
child3调用print方法需要加类作用域,例如child3.Base::print();

谢谢。还没涉及到调用,编译通不过。

你用的什么编译器?我这里vs2005编译运行都没问题

虚拟机,unix gcc 编译器
[/Quote]
我在linux上用g++也能编译运行
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 wzx19840423 的回复:]
引用 13 楼 jg121125 的回复:
引用 12 楼 wzx19840423 的回复:
child3调用print方法需要加类作用域,例如child3.Base::print();

谢谢。还没涉及到调用,编译通不过。

你用的什么编译器?我这里vs2005编译运行都没问题
[/Quote]
虚拟机,unix gcc 编译器
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jg121125 的回复:]
引用 12 楼 wzx19840423 的回复:
child3调用print方法需要加类作用域,例如child3.Base::print();

谢谢。还没涉及到调用,编译通不过。
[/Quote]
你用的什么编译器?我这里vs2005编译运行都没问题
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wzx19840423 的回复:]
child3调用print方法需要加类作用域,例如child3.Base::print();
[/Quote]
谢谢。还没涉及到调用,编译通不过。
  • 打赏
  • 举报
回复
child3调用print方法需要加类作用域,例如child3.Base::print();
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class Base { //基类
public:
void virtual print(void)
{
cout << "base!" <<endl;
}
};

class child1 : public Base
{
public:
void virtual print(void)
{
cout << "child1" << endl;
}
};
class child2 : public Base
{
public:
void virtual print(void)
{
cout << "child2" <<endl;
}
};
class child3 :public child1 , child2
{

};

int main()
{
Base base;
child1 ch1;
child2 ch2;
base.print();
ch1.print();
ch2.print();
child3 ch3;
return 0;
}
二进制浮游 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qq120848369 的回复:]
人家都告诉你让你在child3里再写一个print了,你不写,编译器也不知道该用哪一个腰的print.
[/Quote]
我知道你的意思,我自己也在问题中提过“不考虑在类 child3 中写print函数”。我想确认的是在不改变这个结构的前提下,还有没有其他的方法来避免错误。
qq120848369 2011-07-06
  • 打赏
  • 举报
回复
人家都告诉你让你在child3里再写一个print了,你不写,编译器也不知道该用哪一个腰的print.

64,670

社区成员

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

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