假设我有两个归类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);
}
};
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.有没有机会得到这种代码的警告?
可能你已经猜到了:static_cast<const Base * const>(this)->method(out);是一个虚拟调用,这意味着函数本身就被调用了.在这种情况下,它会导致堆栈溢出.Base::method(out)不是虚拟电话.
| 归档时间: |
|
| 查看次数: |
316 次 |
| 最近记录: |