函数表是全类共享一个,不是一个对象一个。所以才需要用 this 指针来获得当前调用函数的对象究竟是哪个。
另外这种实现方式也不是标准规定的,所以编译器可以自己发挥。
你自己也提了,正确的做法肯定是
A *a = &c
像你这样类型转换是有大问题的。考虑下面的代码:
它是有语法错误。
但如果你试图用 void * 从中迂回,那么就可以避免语法错误。
继承,包括虚继承,编译器都会为类型做很多检查。也会为动态绑定做很多准备,众所周知,多态是基于类型。不是一个地址就能获取全部的信息。
强制转换就等干在告诉编译器“请按我的想法来做”。编译器虽然不知道你要做什么,但是还是会遵从你的指示。
我觉得你这应该是一种未定义的行为,和 ++a + ++a 之类的代码差不多。但我找了半天,也没在标准上找到相关的规定。不过问题挺有意思的,我以前也没怎么考虑过。
另外这种实现方式也不是标准规定的,所以编译器可以自己发挥。
你自己也提了,正确的做法肯定是
A *a = &c
像你这样类型转换是有大问题的。考虑下面的代码:
程序代码:
class A {}; class B : public A {}; class C : public A {}; class D : public B, public C {}; int main() { D d; A* pa = &d; return 0; }
它是有语法错误。
但如果你试图用 void * 从中迂回,那么就可以避免语法错误。
继承,包括虚继承,编译器都会为类型做很多检查。也会为动态绑定做很多准备,众所周知,多态是基于类型。不是一个地址就能获取全部的信息。
强制转换就等干在告诉编译器“请按我的想法来做”。编译器虽然不知道你要做什么,但是还是会遵从你的指示。
我觉得你这应该是一种未定义的行为,和 ++a + ++a 之类的代码差不多。但我找了半天,也没在标准上找到相关的规定。不过问题挺有意思的,我以前也没怎么考虑过。