代码之家  ›  专栏  ›  技术社区  ›  swegi

在该指针上使用静态类型转换的无限循环

  •  0
  • swegi  · 技术社区  · 14 年前

    假设我有两个班 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 . 有没有机会得到这种代码的警告?

    2 回复  |  直到 14 年前
        1
  •  6
  •   amit kumar    14 年前

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

        2
  •  4
  •   Skizz    14 年前

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