求助大佬帮助:想用C语言的结构实现多态,但是为什么创建子类对象时不能在堆空间中创建呢???

在堆空间创造的对象,接受后,并不能正常运行,但是在main中直接定义普通对象却能正常运行?
这是为什么?是我的函数指针有问题吗?
//使用函数:在堆空间完成对象创造,则失败
//DeriveA* deriveA = Creat_A(40, 20);
//后来,我又直接在主函数中写malloc创建堆空间子类对象,仍不能运行,但编译不报错
	//DeriveA* deriveA =(DeriveA*)malloc(DeriveA);
#include <iostream>
using namespace std;
typedef void(*EatPtr)();
typedef void(*PlayPtr)();

typedef struct _virtualPtrTable {
	EatPtr eat;
	PlayPtr play;
}VPtrTable;

typedef struct _base {
	VPtrTable vptrTable;
	int age;
}Base;

typedef struct _deriveA {
	Base base;
	int age;
}DeriveA;

typedef struct _deriveB {
	Base base;
	int age;
}DeriveB;

/** 基类的实现函数 **/
void baseEat() {
	cout << "基类在吃饭....." << endl;
}
void basePlay() {
	cout << "基类在玩耍....." << endl;
}

/** 派生类A的实现函数 **/
void aEat() {
	cout << "子类A在吃饭....." << endl;
}
void aPlay() {
	basePlay();
}

/** 派生类B的实现函数 **/
void bEat() {
	cout << "子类B在吃饭....." << endl;
}
void bPlay() {
	basePlay();
}
DeriveA* Creat_A(int a, int b)
{
	DeriveA * r = new DeriveA;
	r->base.age = a;
	r->age = b;
	r->base.vptrTable.eat = aEat;
	r->base.vptrTable.play = aPlay;
	return r;
}


int main(int argc, char *argv[])
{
	Base *base;


	//使用函数:在堆空间完成对象创造,则失败
	//DeriveA* deriveA = Creat_A(40, 20);
	//后来,我又直接在主函数中写malloc创建堆空间子类对象,仍不能运行,但编译不报错
	//DeriveA* deriveA =(DeriveA*)malloc(DeriveA);
	//deriveA->base.vptrTable.eat = aEat;
	//deriveA->base.vptrTable.play = aPlay;
	//deriveA->base.age = 40;
	//deriveA->age = 20;
	

	//在主函数创建对象则可以正常实现。
	DeriveA deriveA;
	deriveA.base.vptrTable.eat = aEat;
	deriveA.base.vptrTable.play = aPlay;
	deriveA.base.age = 40;
	deriveA.age = 20;
	


	DeriveB deriveB;
	deriveB.base.vptrTable.eat = bEat;
	deriveB.base.vptrTable.play = bPlay;
	deriveB.base.age = 40;
	deriveB.age = 21;

	base = (Base *)&deriveA;
	base->vptrTable.eat();
	base->vptrTable.play();
	cout << "age:" << base->age << endl;
	cout << "---------------------------------------------\n";
	base = (Base *)&deriveB;
	base->vptrTable.eat();
	base->vptrTable.play();
	cout << "age:" << base->age << endl;


	//free(deriveA);
	return 0;
}



-------------------------------------------------分割线----------------------------------------------------
												输出结果:

在主函数中创建普通对象,运行结果如下:
![图片](https://img-blog.csdnimg.cn/202004141003585.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2phc29uMDQyMzY=,size_16,color_FFFFFF,t_70)

如果在堆空间创造的话,编译不报错
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200414100549119.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2phc29uMDQyMzY=,size_16,color_FFFFFF,t_70)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值