覆盖的是哪个类的?

liuzu2016 2012-09-24 03:41:04
class A
{
public:
virtual void fun(){}
};


class B
{
public:
virtual void fun(){}
};


class C :public A,public B
{
void fun() //覆盖那个基类的函数
{

}
};


int main()
{
return 0;
}
...全文
179 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluesandmetal 2012-09-26
  • 打赏
  • 举报
回复
虚函数是两个父类都被覆盖了,所以哪怕把C赋给指向A或B的引用或指针,调用func,调的也是C的func,因为C的版本把A和B的都覆盖了。

如果非虚函数那么有多个版本的,也就是把C赋给指向A或B的引用或指针,调用func,调的是A或B的func。

你说的非虚函数隐藏,就是隐藏非引用或指针类型的版本,就是上面说的那样。

[Quote=引用 13 楼 的回复:]
你的意思是:如果是虚函数在,则两个父类的 都被覆盖?

而如果不是,那么隐藏谁呢?

隐藏这个概念是对非虚函数而言的。






引用 12 楼 的回复:

声明为virtual的函数只能有一个版本,就是实际生成的对象的版本。如果生成实际的对象是C,因为C继承了A和B,而A和B都有func,有了两个版本的func所以会产生歧义,也就是C中的必须有一个func来覆盖A和B……
[/Quote]
bluesandmetal 2012-09-25
  • 打赏
  • 举报
回复
声明为virtual的函数只能有一个版本,就是实际生成的对象的版本。如果生成实际的对象是C,因为C继承了A和B,而A和B都有func,有了两个版本的func所以会产生歧义,也就是C中的必须有一个func来覆盖A和B的func。

不是virtual的函数则可以有多个版本,具体调用哪个版本取决于指向对象的引用或指针的类型。
liuzu2016 2012-09-25
  • 打赏
  • 举报
回复
你的意思是:如果是虚函数在,则两个父类的 都被覆盖?

而如果不是,那么隐藏谁呢?

隐藏这个概念是对非虚函数而言的。





[Quote=引用 12 楼 的回复:]

声明为virtual的函数只能有一个版本,就是实际生成的对象的版本。如果生成实际的对象是C,因为C继承了A和B,而A和B都有func,有了两个版本的func所以会产生歧义,也就是C中的必须有一个func来覆盖A和B的func。

不是virtual的函数则可以有多个版本,具体调用哪个版本取决于指向对象的引用或指针的类型。
[/Quote]
vampire1984 2012-09-24
  • 打赏
  • 举报
回复
都覆盖了阿
漠漠兔八哥 2012-09-24
  • 打赏
  • 举报
回复
都覆盖了
叁叁玖玖 2012-09-24
  • 打赏
  • 举报
回复
应该是 都被覆盖了。
冷月清晖 2012-09-24
  • 打赏
  • 举报
回复
按我的理解是都会被覆盖。
liuzu2016 2012-09-24
  • 打赏
  • 举报
回复

这个文章我看过,

你注意到没有,作者提到一个例子

多重继承(有虚函数重载)

下面我们再来看看,如果发生虚函数重载的情况。

下图中,我们重载了父类的f()函数。


就这这里的例子, 作者提供了一个图,


你不觉得奇怪吗?

父类中有同名虚函数, 对于多重继承来说,我们的派生类 覆盖了这个同名虚函数,

竟然所有的 继承来的虚函数都改变了。


所以我才写了代码,发帖问, 如果

class C :public A,public B
{
void fun() //覆盖那个基类的函数
{

}
};
是覆盖哪一个基类的函数? 是A,还是B,还是所有?






[Quote=引用 5 楼 的回复:]

类A 与 类B 中的虚表中的函数指针 都会被替换为类C 虚函数的函数指针
建议LZ 看下这个 讲的很好
http://blog.csdn.net/ztj111/article/details/1953375
[/Quote]
皮特尔 2012-09-24
  • 打赏
  • 举报
回复
以下来自百度百科:
派生类构造函数执行顺序是先执行所继承基类的构造函数,再执行派生类本身构造函数,处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的各基类顺序,与派生类构造函数中所定义的成员初始化列表的各项顺序无关。也就是说,执行基类构造函数的顺序取决于定义派生类时基类的顺序。可见,派生类构造函数的成员初始化列表中各项顺序可以任意地排列。

所以,我觉得是覆盖A的。
叁叁玖玖 2012-09-24
  • 打赏
  • 举报
回复
类A 与 类B 中的虚表中的函数指针 都会被替换为类C 虚函数的函数指针
建议LZ 看下这个 讲的很好
http://blog.csdn.net/ztj111/article/details/1953375
liuzu2016 2012-09-24
  • 打赏
  • 举报
回复


应该是覆盖A的虚函数



C的虚函数填写到 A的虚函数表中了

所以最后的结果:

只有2个虚函数表!!!

zhaoZero41 2012-09-24
  • 打赏
  • 举报
回复
多重继承,自然是两个基类的虚函数都能实现,如果通过A *a = new C; B *b = new C;这样的方式来定义指针,那么调用fun()都是C中的。
liuzu2016 2012-09-24
  • 打赏
  • 举报
回复
大神们等什么呢
liuzu2016 2012-09-24
  • 打赏
  • 举报
回复
没人啊

64,266

社区成员

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

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