函数表是全类共享一个,不是一个对象一个。所以才需要用 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 之类的代码差不多。但我找了半天,也没在标准上找到相关的规定。不过问题挺有意思的,我以前也没怎么考虑过。









