从std :: exception类和typeid继承

时间:2013-12-27 11:54:13

标签: c++

为什么std :: exception类的继承为以下代码片段提供了不同的输出:

#include <iostream>
#include <typeinfo>

class Base {};
class Derived: public Base {};

int main()
{
  try
  {
    throw Derived();
  }
  catch (const Base& ex)
  {
    std::cout << typeid(ex).name() << '\n';
  }
}

输出

  

class Base

#include <exception>
#include <iostream>
#include <typeinfo>

class Base : public std::exception {};
class Derived: public Base {};

int main()
{
  try
  {
    throw Derived();
  }
  catch (const Base& ex)
  {
    std::cout << typeid(ex).name() << '\n';
  }
}

输出

  

类派生

1 个答案:

答案 0 :(得分:5)

如果它声明或继承了至少一个虚函数,我们称它为多态

typeid()对于多态和非多态类的行为有所不同:https://stackoverflow.com/a/11484105/367273

继承std::exception会使您的类具有多态性(因为std::exception具有虚拟析构函数和虚拟成员函数)。

这解释了两个测试之间的行为差​​异。