在堆空间创造的对象,接受后,并不能正常运行,但是在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;
}
-------------------------------------------------分割线----------------------------------------------------
输出结果:
在主函数中创建普通对象,运行结果如下:

如果在堆空间创造的话,编译不报错
