求教:如何扩展父类的虚函数

jinjiajie 2008-04-17 02:20:08
如 类a有个已经实现的 paintevent方法(虚函数实现)
类b是派生自a,他想在使用类a中的paintevent方法后,在加上自己的代码,不知道以下的实现可行么?

class c{

virturl paintevent(QPaintEvent *event);
}

class a : public c{
void paintevent(QPaintEvent *event);
}

a中paintevent以实现,代码不记


class b : public a{
void paintevent(QPaintEvent *event);
}

b中的
void b::paintevent(QPaintEvent *event){
a::paintevent(event);
.....
.....
}

不知以上代码可行不?我编译执行是通过,但却不太理解,能否有人详细解释下相关原理及其风险性什么的
...全文
133 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
babyofbaby 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qmm161 的回复:]
引用 11 楼 babyofbaby 的回复:
风险就是继承层次太多,或者实例化对象太多的时候,效率会降低。还有不方便扩展类。


为什么说实例化对象太多,效率会降低,能不能解释下?
[/Quote]

如果没有虚拟函数,实例化一个对象只要分配他的成员所用的内存就行了,添加了虚拟函数后,要为每个对象创建内存中一块虚拟表,这就要占用很多内存了。
jinjiajie 2008-04-17
  • 打赏
  • 举报
回复
谢谢各位了....用了3年多的c,c++的东西都还给老师了。面向对象的设计方法我还需要点时间适应,呵呵,peter大哥能把图发我邮箱么?谢谢鸟 1982112400@163.com

唉,换了公司,上网环境苛刻了很多,碰到问题只能来csdn鸟,可怜人啊。。。
qmm161 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 babyofbaby 的回复:]
风险就是继承层次太多,或者实例化对象太多的时候,效率会降低。还有不方便扩展类。
[/Quote]

为什么说实例化对象太多,效率会降低,能不能解释下?
babyofbaby 2008-04-17
  • 打赏
  • 举报
回复
如果考虑到多态以及实例化对象时的不确定性,在不影响效率的情况下尽量用虚函数。
  • 打赏
  • 举报
回复
就是按照你的方法来的,写定类名,方法名字,就直接可以调用基类的函数。
不管是不是需函数都可以。称之为静态绑定,和虚函数没啥关系
babyofbaby 2008-04-17
  • 打赏
  • 举报
回复
风险就是继承层次太多,或者实例化对象太多的时候,效率会降低。还有不方便扩展类。
babyofbaby 2008-04-17
  • 打赏
  • 举报
回复
我画了个图,内存中对象和虚函数地址是怎么分配和调用的,不过不会把图片传上来
babyofbaby 2008-04-17
  • 打赏
  • 举报
回复
可以,执行的时候为每一个类的对象都建立了相应的虚拟表(virtual table),这个表中存了他们各自类内的虚函数的地址(都不相同的),而每个对象在内存中的首地址中存的又是指向他自己虚拟表的地址(虚指针vptr),所以这个对象是各自到自己的虚拟表中去寻找自己对应的虚函数再调用执行的。和它继承的那个已经没关系了。
不知道这样说清楚不
jiangsu288 2008-04-17
  • 打赏
  • 举报
回复
觀注
babyvox1999 2008-04-17
  • 打赏
  • 举报
回复
可行JF
xkyx_cn 2008-04-17
  • 打赏
  • 举报
回复
不错 mark一下
Inhibitory 2008-04-17
  • 打赏
  • 举报
回复
b中的
void b::paintevent(QPaintEvent *event){
a::paintevent(event); // 对, 就是这样做, Java中就换成了super.paintevent(event);了, C++中是用户类的名字
.....
.....
}

嘿嘿, Qt, 我喜欢, 不过那个paintevent是乎写成paintEvent(QPaintEvent *event)更好一些.
qiucp 2008-04-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 z_kris 的回复:]
当然可以的啊

PS:戒指说的没错,看设计模式,在你打算使用继承之前应该先考虑组合能否也实现你的需求,如果可以,那么应该使用组合而不是继承
[/Quote]
xx
z_kris 2008-04-17
  • 打赏
  • 举报
回复
从内存布局中来看,你可以粗略的把基类看作是在派生类的体类。
我是这么理解的,楼主google一下虚函数表,实际上没什么风险性,只是空间效率上会有些影响。
最常见的这种用法是MFC里面的消息响应函数,比如OnOK(),OnCancel()之类
z_kris 2008-04-17
  • 打赏
  • 举报
回复
当然可以的啊

PS:戒指说的没错,看设计模式,在你打算使用继承之前应该先考虑组合能否也实现你的需求,如果可以,那么应该使用组合而不是继承
Treazy 2008-04-17
  • 打赏
  • 举报
回复
可行,没问题

不过继承的层次如果太深的话效率就比较低了

可以同时考虑组合,至少有的时候组合比继承好

64,632

社区成员

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

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