基类的构造函数里不能访问虚函数 那有没有好的设计可以实现这个效果

caozl 2011-12-10 04:01:46
如题。
具体情况为:
我打算写的类在构造的时候需要初始化一些数据。而且每个子类可能有多个构造函数。所以我写了个initData虚函数。想在基类的默认构造函数里调用。扩展子类的时候只有重写一下initData函数即可。 结果发现学艺不精,悲剧了。
可是如果不用虚函数。感觉让别人写子类的时候需要在每个构造函数去初始化数据。感觉比较麻烦。
请教一下大家 有没有什么设计或者思路可以实现这个效果?
...全文
232 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
gykgod 2011-12-12
  • 打赏
  • 举报
回复
节省了虚函数的开销啊 您是发明家 计算机大师
gykgod 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shayla 的回复:]
楼上说的不错。

不过仅从楼主想法可实现上来说,我考虑了一下,还是有方法的,需要用到模板:



C/C++ code

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

template<class T>
class Base
{
public:
Base()
{
……
[/Quote]


你太聪明了,WTL 就是这么做的 膜拜~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pathuang68 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 akirya 的回复:]

基类不应该 去管派类的事情。
[/Quote]

++

也就是说在基类的构造函数中,不应该去考虑怎么适应派生类对象构造这方面(比如调用一个虚函数)的事情。这样会造成死循环。

要解决楼主这样的问题并不难,你可以考虑使用设计模式来解决这类问题。
caddor 2011-12-12
  • 打赏
  • 举报
回复
牛X

学习了




[Quote=引用 10 楼 shayla 的回复:]
楼上说的不错。

不过仅从楼主想法可实现上来说,我考虑了一下,还是有方法的,需要用到模板:



C/C++ code


#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

template<class T>
class Base
{
public:
Base()
{
……
[/Quote]
shayla 2011-12-12
  • 打赏
  • 举报
回复
在STL中我觉得有些应用跟这种模式还是比较类似的
shayla 2011-12-12
  • 打赏
  • 举报
回复
楼上说的不错。

不过仅从楼主想法可实现上来说,我考虑了一下,还是有方法的,需要用到模板:



#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

template<class T>
class Base
{
public:
Base()
{
((T*)this)->InitData();
};

protected:
private:
};

class Child : public Base<Child>
{
public:
BOOL InitData()
{
printf("child InitData\n");
return TRUE;
}
};

int main(int argc, char* argv[])
{
Child object;
return 0;
}
黑娃 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]

你的“感觉麻烦”是一个错误的感觉。
难道你一天只吃一顿饭?因为吃3次太麻烦了?
[/Quote]

这个比喻还扯也~~
小默 2011-12-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 akirya 的回复:]

基类不应该 去管派类的事情。
[/Quote]
就是,你管好自己的类就行了,别人继承之后谁知道添加了神马玩意,都面目全非了,该怎么初始化让他自己解决。
「已注销」 2011-12-12
  • 打赏
  • 举报
回复
InitData写到构造函数里, 你怎么知道初始化数据成功了? 构造函数又没返回值。
如果只是对数据初始化, 也没什么问题, 子类的虚方法调用一下基类的虚方法CBase::InitData就可以了。 一般不都不建议将初始化方法写到构造函数里的吗? 调用一下初始化也不麻烦。
qscool1987 2011-12-12
  • 打赏
  • 举报
回复
MFC中不经常这么用吗,OnInitDialog()函数
  • 打赏
  • 举报
回复
基类不应该 去管派类的事情。
caozl 2011-12-12
  • 打赏
  • 举报
回复
难道只有我遇到过这种问题吗?就没有什么设计模式可以解决这种问题?
机智的呆呆 2011-12-10
  • 打赏
  • 举报
回复
可以专门抽出一个初始化的接口啊~~
比如initData虚函数,在文档说明创建完对象要调用initData函数
老邓 2011-12-10
  • 打赏
  • 举报
回复
C++1x可以解决你的问题,很优雅的。
taodm 2011-12-10
  • 打赏
  • 举报
回复
你的“感觉麻烦”是一个错误的感觉。
难道你一天只吃一顿饭?因为吃3次太麻烦了?

64,648

社区成员

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

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