3

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

我无法理解9.4.2 Dependent Base Classes中的部分内容。

这是其中的部分文本:http ://tinypaste.com/633f0

// Variation 2: 
template<typename T> 
class DD2 : public Base<T> { 
  public: 
    void f() { Base<T>::basefield = 0; } 
}; 

我需要帮助可视化上述文本中的行(或问题域)“必须小心使用此解决方案,因为如果使用非限定的非依赖名称来形成虚函数调用,那么限定会抑制虚拟调用机制和含义程序发生变化。尽管如此,在某些情况下无法使用第一个变体,而这种替代方案是合适的”

我理解不合格的非依赖名称等,但将它们与虚函数调用混合是我所无法理解的。

4

2 回答 2

2

如果限定名称 ( 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
}
于 2011-10-20T13:02:44.390 回答
1

使用限定标识符class-name::function()会抑制 的虚拟性function,因此您应该this->function()改用。

这也适用于数据成员:this->basefield.

于 2011-12-25T21:55:16.647 回答