假設我有兩個歸類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
。 有沒有機會獲得這種代碼的警告?