我正在阅读电子书模板完整指南和问题,我会问你可能对你很愚蠢但是......
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; }
};
我需要帮助可视化上面文本中的行(或问题域)“必须小心使用此解决方案,因为如果使用非限定非独立名称来形成虚拟函数调用,则限定禁止虚拟呼叫机制和程序改变的意义。尽管如此,有些情况下第一个变体不能使用,这种替代方案是合适的“
我理解不合格的非独立名称等,但将它们与虚函数调用混合是我的目的。
答案 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
。