假设我有两个班
Base
和
Derived
,即:
#include <iostream>
class Base {
public:
Base ()
: m_name("Base")
{
}
virtual ~Base ()
{
}
virtual void method (std::ostream & out) const
{
out << m_name << std::endl;
}
protected:
Base (std::string name)
: m_name(name)
{
}
private:
std::string m_name;
};
class Derived : public Base {
public:
Derived ()
: Base("Derived")
{
}
virtual ~Derived ()
{
}
virtual void method (std::ostream & out) const
{
static_cast<const Base * const>(this)->method(out);
}
};
如果我打电话
Derived::method()
,我得到一个无限循环。
int main ()
{
Derived d;
d.method(std::cout);
return 0;
}
当然。我可以换
static_cast<const Base * const>(this)->method(out);
到
Base::method(out)
一切都会好起来的,但我对这种行为背后的原因感兴趣。
两个都不应该有相同的行为吗?
有人能解释一下这里发生了什么吗?
在旁注中,我用
g++ -Wall -Wextra -O2 -g foo.cpp -o foo
.
有没有机会得到这种代码的警告?