C++ 理解虚函数调用和依赖基类的混淆
我正在阅读电子书模板的完整指南和问题,我想问的问题对你们来说可能很愚蠢,但 9.4.2依赖基类中有一节我无法理解 以下是其中的部分文本:C++ 理解虚函数调用和依赖基类的混淆,c++,templates,inheritance,name-lookup,qualified-name,C++,Templates,Inheritance,Name Lookup,Qualified Name,我正在阅读电子书模板的完整指南和问题,我想问的问题对你们来说可能很愚蠢,但 9.4.2依赖基类中有一节我无法理解 以下是其中的部分文本: //变体2: 模板 类DD2:公共基{ 公众: void f(){Base::basefield=0;} }; 我需要帮助可视化的行(或问题域)在上面的文字“使用此解决方案时必须小心,因为如果使用非限定的非从属名称来形成虚拟函数调用,则限定将禁止虚拟调用机制,并且程序的含义将发生变化。尽管如此,在某些情况下,第一种变体无法使用,而此替代方案是合适的“ 我理
//变体2:
模板
类DD2:公共基{
公众:
void f(){Base::basefield=0;}
};
我需要帮助可视化的行(或问题域)在上面的文字“使用此解决方案时必须小心,因为如果使用非限定的非从属名称来形成虚拟函数调用,则限定将禁止虚拟调用机制,并且程序的含义将发生变化。尽管如此,在某些情况下,第一种变体无法使用,而此替代方案是合适的“
我理解非限定的非独立名称等,但将它们与虚拟函数调用混合在一起是我无法理解的。如果限定名称(basefield)是虚拟函数,则限定将禁止虚拟调用。这与以下情况非常相似:
struct Base {
virtual void vCall() { }
};
struct Derived : public Base {
virtual void vCall() { }
};
int main() {
Derived d;
Base* inst = &d;
inst->Base::vCall(); // By qualifying we won't get virtual dispatch;
// this calls Base::vCall directly
}
使用限定标识符
类名::function()
会抑制函数的虚拟性,因此您应该改用此->函数()
这也适用于数据成员:This->basefield
这是一个可怕的句子,不是吗,这段代码似乎是为了允许非虚拟多态行为而设计的。例如,派生类可以重写基类中的方法,但查找是在编译时完成的。我怀疑“禁止”“从这个意义上讲,意味着您将无法获得通常基于vtable的动态运行时查找……需要更多的上下文。这段代码试图解决的问题是什么?
struct Base {
virtual void vCall() { }
};
struct Derived : public Base {
virtual void vCall() { }
};
int main() {
Derived d;
Base* inst = &d;
inst->Base::vCall(); // By qualifying we won't get virtual dispatch;
// this calls Base::vCall directly
}