gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:25 24 4
gpt4 key购买 nike

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

最佳答案

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

关于c++ - 在此指针上使用 static_cast 的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3733933/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com