了解调用堆栈

时间:2014-12-12 09:48:42

标签: c++ callstack

我有以下方法:

std::string MaterialLayer::getName()
{
    std::string idfMaterialName = this->material->getName() + std::string("-") +   cea::wstring2string(StringConverterHelper::toString((static_cast<double>((floor(this->thickness*1000)) / 10))));

    return idfMaterialName;
}

通过以下代码调用:

bsm::MaterialLayer * ml = this->o_bsm_material_layer;
std::string name = ml->getName();

当我在第二行(调用ml-&gt; getName()时)进行调试时,我输入了以下方法:

void Material::setName(const std::string &name)
{
    this->name = name;
}

但我无法理解为什么调用它是因为被调用的方法是Material类的setter,而原始调用是在MaterialLayer类的getter上!!!

我指定:

  • 我已经重建了所有解决方案
  • all以Debug modality
  • 编译
  • Visual Studio是2010
  • setName()的参数名称在调用时刻,这导致稍后抛出异常,并且需要这个调试活动源于抛出的异常,以便理解为什么......

1 个答案:

答案 0 :(得分:3)

我能想象出这样的事情的唯一方法就是这样的例子:

class A
{
public:
  virtual void FuncA() ;
} ;


class B
{
public:
  virtual void FuncB() ;
} ;


void A::FuncA()
{
  printf("FuncA\n") ;
}

void B::FuncB()
{
  printf("FuncB\n") ;
}

int main()
{
  A a ;
  B *b ;

  b = (B*)&a ;

  a.FuncA();    // calls A::FuncA
  b->FuncB();   // b points actually to an A object
                // calling B::FuncB now actually calls A::FuncA

  return 0 ;
}

我想你的程序中会发生类似的事情。