在此指针上使用static_cast的无限循环

swe*_*egi 0 c++ casting

假设我有两个归类BaseDerived,即:

#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); 
        }
    };
Run Code Online (Sandbox Code Playgroud)

如果我打电话Derived::method(),我会得到一个无限循环.

int main ()
{
Derived d;
d.method(std::cout);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

当然.我可以改变static_cast<const Base * const>(this)->method(out);Base::method(out)一切都将运行良好,但我感兴趣的这种行为背后的原因.两个都不应该有相同的行为?

所以有人可以解释这里发生了什么吗?

另外,我编写了代码g++ -Wall -Wextra -O2 -g foo.cpp -o foo.有没有机会得到这种代码的警告?

ami*_*mit 6

可能你已经猜到了:static_cast<const Base * const>(this)->method(out);是一个虚拟调用,这意味着函数本身就被调用了.在这种情况下,它会导致堆栈溢出.Base::method(out)不是虚拟电话.