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

时间:2011-10-20 12:19:10

标签: c++ templates inheritance name-lookup qualified-name

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

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; } 
}; 

我需要帮助可视化上面文本中的行(或问题域)“必须小心使用此解决方案,因为如果使用非限定非独立名称来形成虚拟函数调用,则限定禁止虚拟呼叫机制和程序改变的意义。尽管如此,有些情况下第一个变体不能使用,这种替代方案是合适的“

我理解不合格的非独立名称等,但将它们与虚函数调用混合是我的目的。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:1)

使用限定标识符class-name::function()会禁止function的虚拟化,因此您应该使用this->function()

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