的同事,今天問我關於代碼看起來有點像這樣:抽象基類調用父的純虛函數
#include <iostream>
template <class T>
class IBase {
public:
virtual ~IBase() {}
public:
virtual void foo() = 0;
};
template <class T>
class Base : public IBase<T> {
public:
virtual void bar() {
foo(); // compiler error
}
};
class Derived : public Base<int> {
public:
virtual void foo() {
std::cout << "Hello World!\n";
}
};
int main() {
Derived d;
d.bar();
}
起初他得到一個編譯器錯誤說「foo()
」沒有被發現。好的,所以他試圖將其更改爲IBase<T>::foo();
。雖然編譯,它導致鏈接器錯誤。所以我馬上回憶起,之前我看到過這種類型的問題,並建議他改爲寫this->foo();
。中提琴!問題解決了!
然後他問我爲什麼不明白foo();
工作? 是不是this->x();
基本相同,x();
?老實說,我不知道,但他激怒了我的興趣。所以,我們在這裏:
總結:
virtual void bar() {
this->foo(); // works
//IBase<T>::foo(); // linker error
//foo(); // compiler error
}
問題是爲什麼需要this->
。爲什麼其他選項不起作用?
但'Base ::'也禁止虛擬調用語義,這就是爲什麼存在鏈接器錯誤。 –
@SebastianRedl:好點,我沒有想到通過正確。 –