代码之家  ›  专栏  ›  技术社区  ›  orezvani

未定义对父类中方法的引用

  •  2
  • orezvani  · 技术社区  · 10 年前

    我的课程有三节课,

    class A {
    public:
      virtual ~A() {
        decompose();
      }
      virtual void decompose();
    };
    
    class B:public A {
    private:
      int *b_data;
    public:
      void decompose() {
        if (b_data != NULL) delete [] b_data;
      }
    };
    
    class C:public A {
    private:
      int *c_data;
    
    public:
      void decompose() {
        if (b_data != NULL) delete [] c_data;
      }
    };
    

    但是当我用g++编译这段代码时,我得到了错误:

    In function `~A':
    undefined reference to `vtable for A'
    undefined reference to `A::decompose()'
    
    In function `A':
    undefined reference to `vtable for A'
    undefined reference to `typeinfo for A'
    undefined reference to `typeinfo for A'
    

    如果有帮助,请上课 A .h file及其析构函数是内联定义的,另外两个类有两个文件 .h时 .cpp .

    在我的程序中,我根据以下内容调用这些类:

    int main() {
      A *a;
      a = new B();  //constructor is defined
      delete a;
      return 0;
    }
    

    此代码有问题吗?

    3 回复  |  直到 10 年前
        1
  •  2
  •   Neil Kirk    10 年前

    请注意在构造函数和析构函数中调用虚拟函数。它们并没有被视为正常。 A(..) ~A() 总是打电话 A::decompose 。我认为编译器正在抱怨它找不到这个函数。

        2
  •  1
  •   4pie0    10 年前

    错误是由于调用 A::decompose 在里面 B C 析构函数。这个 A: :分解 即使析构函数是虚拟的,而方法本身是虚拟的。什么时候 A. 为派生对象运行析构函数 B C ,对象的派生部分已被销毁。

    class A {
    public:
      virtual void decompose() { std::cout << "A";}
      virtual ~A() {
        decompose();
      }
    };
    
    class B:public A {
    private:
      int *b_data;
    public:
      void decompose() {
          std::cout << "B";
        if (b_data != NULL) delete [] b_data;
      }
    };
    
    class C:public A {
    private:
      int *c_data;
    public:
      void decompose() {
          std::cout << "C";
        if (c_data != NULL) delete [] c_data;
      }
      ~C() {}
    };
    
    int main(int argc, char** argv) {
        B b;
        C c;
        return 0;
    }
    

    输出:

    AA级


    解决方案:

    class A {
    public:
      virtual void decompose() = 0;
      virtual ~A() {
          std::cout << "~A";
      }
    };
    class B:public A {
    private:
      int *b_data;
    public:
      void decompose() {
          std::cout << "B_decompose"; if (b_data != NULL) delete [] b_data;
      }
      ~B() { std::cout << "~B";}
    };
    
    class C:public A {
    private:
      int *c_data;
    public:
      void decompose() {
          std::cout << "C_decompose"; if (c_data != NULL) delete [] c_data;
      }
      ~C() { std::cout << "~C";}
    };
       int main(int argc, char** argv) {
           B b;
           C c;
            A* p = &b;
            p->decompose();
            p = &c;
            p->decompose();
            return 0;
        }
    

    compiled example

    compiled example (solution)

        3
  •  1
  •   Vince    10 年前

    创建您的 A::decompose 基类中的函数

    virtual void decompose(){};