user-0 提问:  网上找的C模拟面向对象多态的方法例子，有个错误解决不了，请大神指点

回复:
user: user-0
content: 引用 16 楼 user-2 的回复:[quote=引用 15 楼 xflltw 的回复:] [quote=引用 14 楼 xflltw 的回复:] [quote=引用 12 楼 user-2 的回复:] 为方便运行，我把所有文件放在一起，并把include 自定义文件注释掉了， 修改后的代码与运行结果见http://ideone.com/VgWWWg 你在base.h中加了“const void *Base;”，能不加这个么？[/quote] 谢谢[/quote] 不能。就靠这个为0定位到struct Base类。[/quote] 谢谢啦，我再看看

user: user-1
content: 李涛你又调皮了

user: user-2
content: 引用 15 楼 xflltw 的回复:[quote=引用 14 楼 xflltw 的回复:] [quote=引用 12 楼 user-2 的回复:] 为方便运行，我把所有文件放在一起，并把include 自定义文件注释掉了， 修改后的代码与运行结果见http://ideone.com/VgWWWg 你在base.h中加了“const void *Base;”，能不加这个么？[/quote] 谢谢[/quote] 不能。就靠这个为0定位到struct Base类。

user: user-0
content: 引用 14 楼 xflltw 的回复:[quote=引用 12 楼 user-2 的回复:] 为方便运行，我把所有文件放在一起，并把include 自定义文件注释掉了， 修改后的代码与运行结果见http://ideone.com/VgWWWg 你在base.h中加了“const void *Base;”，能不加这个么？[/quote] 谢谢

user: user-0
content: 引用 12 楼 user-2 的回复:为方便运行，我把所有文件放在一起，并把include 自定义文件注释掉了， 修改后的代码与运行结果见http://ideone.com/VgWWWg 你在base.h中加了“const void *Base;”，能不加这个么？

user: user-0
content: 引用 11 楼 user-2 的回复:实测这样更改有效：  1。circleConstructor函数中增加， struct Base *p = (struct Base *)self->point; //self->point分配内存 self->point->Base = p;  因为在new函数把base指针最近的上一级，即point指针  2。 把privateCircle结构体中的point指针改名Base（circle_.c中使用point的地方也改成Base） Base结构体中也增加一个名为Base的指针并初始化为0(circle_.c与point_.c中也相应修改) 这样可以用来向上搜索到顶部 3。 new_.c中的draw函数改成 const struct Base *cp = (const struct Base *)self; while (cp->Base) { 	cp = *(const struct Base **) (cp);  } cp->draw(self);  好的，非常感谢，我正在看

user: user-2
content: 主要错在new函数中的这句*(const struct Base**)p = base; point直接继承自base，所以可以取到，circle隔开了，所以取不到

user: user-2
content: 为方便运行，我把所有文件放在一起，并把include 自定义文件注释掉了， 修改后的代码与运行结果见http://ideone.com/VgWWWg

user: user-2
content: 实测这样更改有效：  1。circleConstructor函数中增加， struct Base *p = (struct Base *)self->point; //self->point分配内存 self->point->Base = p;  因为在new函数把base指针最近的上一级，即point指针  2。 把privateCircle结构体中的point指针改名Base（circle_.c中使用point的地方也改成Base） Base结构体中也增加一个名为Base的指针并初始化为0(circle_.c与point_.c中也相应修改) 这样可以用来向上搜索到顶部 3。 new_.c中的draw函数改成 const struct Base *cp = (const struct Base *)self; while (cp->Base) { 	cp = *(const struct Base **) (cp);  } cp->draw(self);

user: user-2
content: 引用 9 楼 xflltw 的回复:[quote=引用 7 楼 user-2 的回复:] 主要错在new函数中的这句*(const struct Base**)p = base; point直接继承自base，所以可以取到，circle隔开了，所以取不到 这一句应该是没问题的，“Circle Constructor: 3, 4, 5”都打印出来了 [/quote] circle constructor3 4 5可以打印出来是因为传给new函数是的Circle全局变量 而传给draw函数的是p2

user: user-0
content: 引用 7 楼 user-2 的回复:主要错在new函数中的这句*(const struct Base**)p = base; point直接继承自base，所以可以取到，circle隔开了，所以取不到 这一句应该是没问题的，“Circle Constructor: 3, 4, 5”都打印出来了

user: user-0
content: 这一句应该是没问题的，“Circle Constructor: 3, 4, 5”都打印出来了

user: user-2
content: 不是跑起来了吗，Here's the error, in new_.c, why can't invoke draw method in circle?就是程序输出的

user: user-0
content: 引用 5 楼 user-2 的回复:我试了下，输出是： Circle Constructor: 3, 4, 5 new: draw Point draw: 1, 2 new: draw Segmentation fault (core dumped) 应该调用circle_.c的circleDraw方法

user: user-2
content: 我试了下，输出是： Circle Constructor: 3, 4, 5 new: draw Point draw: 1, 2 new: draw Segmentation fault (core dumped)

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 xflltw 的回复:] [quote=引用 1 楼 user-2 的回复:] 不是跑起来了吗，Here's the error, in new_.c, why can't invoke draw method in circle?就是程序输出的 应该调用circle的draw方法[/quote] Here's the error, in new_.c, why can't invoke draw method in circle 这句话就写在draw函数里面，所以已经调用了[/quote]  应该调用circle_.c的circleDraw方法

user: user-2
content: 引用 2 楼 xflltw 的回复:[quote=引用 1 楼 user-2 的回复:] 不是跑起来了吗，Here's the error, in new_.c, why can't invoke draw method in circle?就是程序输出的 应该调用circle的draw方法[/quote] Here's the error, in new_.c, why can't invoke draw method in circle 这句话就写在draw函数里面，所以已经调用了

user: user-0
content: 引用 1 楼 user-2 的回复:不是跑起来了吗，Here's the error, in new_.c, why can't invoke draw method in circle?就是程序输出的 应该调用circle的draw方法