“使用对象对虚拟函数的调用总是静态解析。只能通过指针或引用获得动态解析。”
这句话与其说是描述C++语言的规则,不如说是编译器可以采用的快捷方式。
您正在呼叫
showFunction
直接在对象的名称上。所以假设
showFunction公司
已声明为虚拟。编译器知道调用的对象的确切类型
first
和
second
:它们不可能是其他类型的对象。因此,尽管语言说任何重写函数都必须由
first.showVolume()
和
second.showVolume()
,除了编译器可以立即找到的函数外,不可能得到任何其他函数,因此实际上不需要编写任何代码来确定在生成的程序中调用哪个函数。正确的功能
Mainclass::showVolume()
(或
Derivedclass::showVolume()
,如果存在的话),可以直接调用,这样效率会稍微高一些。
该报价不适用于
Volume()
在…内
showVolume()
自从
Volume
命名非静态成员,
卷()
表示与相同
this->Volume()
。
this
是一个指针,它可能指向完整类型与类型匹配的对象,也可能不指向该对象
Mainclass* const
指针的。因此,在这种情况下,编译器需要进行动态解析,以确定要调用哪个函数。
但还有一件事需要注意:的确,您只能通过指针或引用获得动态分辨率,但您不是这样的
总是
通过指针或引用获取动态分辨率。将函数命名为“限定id”时
::
标记,该语言表示调用的函数是静态确定的,重写被忽略。例如,如果您的代码
showVolume()
更改为使用
Mainclass::Volume()
或
this->Mainclass::Volume()
,你会发现它从不呼叫
Derivedclass::Volume
。