Open Private0xCC opened 6 years ago
@wenchen1995 今天看了下你说的多继承的内存布局,之前我还真没注意这个事情。但是我用老代码测试了一下多继承(无论是否虚继承)的委托,运行也没错。你所说的具体的应用场景是什么呢?可以给我一个错误的示例吗? 我是这样测试的: struct BaseX { virtual void Fun1( int x, int y ) { cout << "BaseX" << endl; } }; struct AAX : virtual BaseX { void Fun1( int x, int y ) override { cout << "AAX" << endl; } }; struct BBX : virtual BaseX { void Fun1( int x, int y ) override { cout << "BBX" << endl; } }; struct CCX : AAX, BBX { void Fun1( int x, int y ) override { cout << "CCX" << endl; } };
你上面的几个类都加上一个int类型的成员,再试试。由于你这几个类都是没有成员的,所以不管是基类还是父类,this指针都是一样的,所以才不会出问题。 qq 291498682 有机会可以交流下
你上面的几个类都加上一个int类型的成员,再试试。由于你这几个类都是没有成员的,所以不管是基类还是父类,this指针都是一样的,所以才不会出问题。 qq 291498682 有机会可以交流下
亲,我又尝试了各种方案:1、每个类加一个变量(无论父子是否有同名变量);2、在外部给委托赋值,或者在对象内部用this指针给委托赋值;3、虚多继承或者普通的多继承;4、类里有多个虚函数; 无论怎么实验运行委托,最后都是正确的结果。 我还是不懂在多继承里面,this会出什么问题?就目前来看,这个问题在一般的应用场景下很难暴露出来,可能是某些不合理的结构设计才会出问题。
还有你的qq要验证一个很奇怪的问题。
成员函数指针的调用必须要 this 指针。像这样: (pthis->mfp)(int arg); 成员函数实际上就是普通函数,编译器在编译阶段会给我们的函数的参数列表加上一个 void this 参数 对于单继承类来说,this 是不需要调整的,而对于 多继承和虚继承以及未知继承,this需要做相应的调整。 但是你的代码没有兼容。可以在代码中手动调整this。