关于抽象类的问题

efei 2007-02-09 04:01:59
class a{
virtual void test()=0;
};

class b:public a{
};

这样的一个关系,那么b是不能被new出来的,因为它没有实现test()。

那么,如果我malloc一个b来,并且试图调用它的test()函数,会发生什么事情?
...全文
268 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
htqx 2007-02-10
  • 打赏
  • 举报
回复
想法不错.
但是不存在的东西,你不可能能调用,至少,你得想办法自己将另一个函数放在里面.
然后在按正常的写法来调用.

b *pb = (b*)new char[ sizeof(b) ];
pb->b::b();
pb->print(); //print 实现了的virtual函数
//pb->b::~b();
delete[] pb;

不过这种c语言的黑客精神,似乎没有什么意义.
sarh2onacy 2007-02-10
  • 打赏
  • 举报
回复
要搞清楚这个问题,首先要明白,new和malloc都会作些什么。
new有两种形式:new函数,new操作符。
前者和malloc的作用是一样的,就是分配一块没有初始化的raw memory,用一个void*型的指针指向它。用法:
int size=10;
void *p=new(size);
后者是c++特有的,它会先执行上面的功能分配一块内存,内存的大小就是其后面的类所占空间,然后在这块空间上执行该类的构造函数,对这块raw memory实施初始化。返回一个该类的指针指向该空间。用法:
class A;
A *p=new A;

显然如果用malloc去初始化一个类,结果只能是未定义。

不知道楼主研究这个是什么目的。
是纯灵感突发,还是实际操作中遇到了什么困难?
如果是前者奉劝放弃这个想法,有点钻牛角尖了。
如果是后者,不妨改换思路。毕竟malloc和new属于两个不同的体系,不能相提并论。
gameboy007 2007-02-10
  • 打赏
  • 举报
回复
这样做不可行,根本不能得到任何答案,所以没有意义
1) malloc只管配置b的内存,没有初始化对象b,就更不用说a了。
2) 就算你成功制做了b和a,但b没有继承a的test函数,而a的test又是个纯抽象函数。

不要浪费精力在这问题上。
magicsutra 2007-02-09
  • 打赏
  • 举报
回复
楼上说的有理,其实,在虚表里,纯虚函数被一断代码取代,调用就抛出异常。
Johnny_de 2007-02-09
  • 打赏
  • 举报
回复
根本不能调用,因为你只是在内存里分配了空间,但是并没有初始化,这样的对象是不成立的
Silent_Spring 2007-02-09
  • 打赏
  • 举报
回复
你自己malloc一个b出来?你自己构建VTABLE?
不是和编译器构建一样吗?
你自己就能发现你没有足够的信息生成b的实体.(VTABLE不完全!!!)
飞哥 2007-02-09
  • 打赏
  • 举报
回复
即使你malloc出来,也不能用
----
FingerStyle 2007-02-09
  • 打赏
  • 举报
回复
楼主真能想..呵呵...
todototry 2007-02-09
  • 打赏
  • 举报
回复
如果我malloc一个b来
==========
你可以试试

64,683

社区成员

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

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