IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    pure virtual method called

    dutor发表于 2012-04-23 17:22:49
    love 0

    看下面程序有什么问题?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    class X { 
    public:
      X() {
        h();
      }
      virtual ~X() {}
      virtual void f() = 0;
      void h();
    };
    void X::h() {
      f();
    }
    void X::f() {
    }
     
    class Y : public X { 
    public:
      Y() { } 
      void f() {
        return ;
      }
    };
    int main() {
      Y y;
      return 0;
    }

    这个呢?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    class X { 
    public:
      X() {
      }
      virtual ~X() {}
      virtual void f() = 0;
    };
     
    class Y : public X { 
    public:
      Y() { } 
      void f() {
        return ;
      }
    };
     
    int
    main()
    {
      X *x = new Y;
      x->~X();
      x->f();
      return 0;
    }

    这两个程序的输出均是:

    pure virtual method called
    terminate called without an active exception
    Aborted (core dumped)
    

    原因和父类/子类的构造、析构的顺序,以及vtbl的相应变化有关,有兴趣的同学可以研究下。
    注:纯虚函数在纯虚类的vtbl中的对应表项为函数__cxa_pure_virtual(),该函数会调用terminate(),后者打印”pure virtual method called”信息后调用abort自杀。



沪ICP备19023445号-2号
友情链接