C++ 理解虚函数调用和依赖基类的混淆

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;} }; 我需要帮助可视化的行(或问题域)在上面的文字“使用此解决方案时必须小心,因为如果使用非限定的非从属名称来形成虚拟函数调用,则限定将禁止虚拟调用机制,并且程序的含义将发生变化。尽管如此,在某些情况下,第一种变体无法使用,而此替代方案是合适的“ 我理

我正在阅读电子书模板的完整指南和问题,我想问的问题对你们来说可能很愚蠢,但

9.4.2依赖基类中有一节我无法理解

以下是其中的部分文本:

//变体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
}