标签:this指针

共 1 篇文章

MS Visual Studio对C++多继承的相关实现

本文的内容来自于在VS2013中的实验,只能说明一种可行的实现途径,不代表编译器必须这样实现。后续内容中如未特殊提及,编译器代指VS2013。

首先,我们来明确一个观点:在类成员方法中,this指针是否一定要指向这个对象的内存起始处?答案是不一定,指向起始处当然是很方便我们这些脑算成员变量偏移的,因为只用做加法就行了,但是对于编译器而言,它只需要确定好一个关于this指向的原则,随后基于这个原则,不管偏移要加法还是减法,对它来说都是没什么区别的。因此,this的指向实际上是编译器自己决定的,它可以遵照常规的想法,在进入成员方法代码前,把this调整至对象内存起始,或者是为了性能,采用它自己的原则。

显然,VS这样的编译器使用的是后者,它出于性能考虑,约定了自己的原则:this指针在一个类成员方法中的指向,取决于该方法的来源。具体来说:

  • 如果该方法首次声明在本类中,那么this指向本类对象的内存起始位置。
  • 如果该方法首次声明不在本类中,即来自于父类,那么this应指向第一个声明此方法的父类,也就是多继承的情况下,在子类的视角中,顺序靠前的父类覆盖靠后的父类。

由于类成员方法是可以在继承关系中调用的,即子类对象可以调用父类的public成员方法。那么,按照这个原则中的第2条,编译器需要做一些调整工作。

下面举个例子,并结合例子来讲讲this调整的过程:

namespace base_adjust_rule ...
阅读全文