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

时间:2010-09-17 08:58:06

标签: 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); 
        }
    };

如果我致电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编译了代码。 有没有机会得到这种代码的警告?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

您将成员函数声明为虚拟。简而言之,这意味着当您通过指向基类的指针访问对象时,将调用派生类的实现。