的同事,今天问我关于代码看起来有点像这样:抽象基类调用父的纯虚函数
#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:好点,我没有想到通过正确。 –