首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于抽象类的有关问题

2012-03-29 
关于抽象类的问题classa{virtualvoidtest()0}classb:publica{}这样的一个关系,那么b是不能被new出来的

关于抽象类的问题
class   a{
    virtual   void   test()=0;
};

class   b:public   a{
};

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

那么,如果我malloc一个b来,并且试图调用它的test()函数,会发生什么事情?

[解决办法]
你自己malloc一个b出来?你自己构建VTABLE?
不是和编译器构建一样吗?
你自己就能发现你没有足够的信息生成b的实体.(VTABLE不完全!!!)
[解决办法]
想法不错.
但是不存在的东西,你不可能能调用,至少,你得想办法自己将另一个函数放在里面.
然后在按正常的写法来调用.

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

不过这种c语言的黑客精神,似乎没有什么意义.

[解决办法]
这样做不可行,根本不能得到任何答案,所以没有意义
1) malloc只管配置b的内存,没有初始化对象b,就更不用说a了。
2) 就算你成功制做了b和a,但b没有继承a的test函数,而a的test又是个纯抽象函数。

不要浪费精力在这问题上。
[解决办法]
要搞清楚这个问题,首先要明白,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属于两个不同的体系,不能相提并论。

热点排行