假设我有两个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
编译了代码。
有没有机会得到这种代码的警告?
答案 0 :(得分:6)
可能你已经猜到了:static_cast<const Base * const>(this)->method(out);
是一个虚拟调用,这意味着该函数在其自身内被调用。在这种情况下,它会导致堆栈溢出。 Base::method(out)
不是虚拟通话。
答案 1 :(得分:4)
您将成员函数声明为虚拟。简而言之,这意味着当您通过指向基类的指针访问对象时,将调用派生类的实现。