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

Undefined reference to method in parent class

本文关键字:未定义 引用 方法 父类      更新时间:2023-10-16

我的程序中有三个类,

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文件中,它的析构函数是内联定义的,另外两个类有两个文件.h.cpp

在我的程序中,我按照以下方式调用这些类:

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

这个代码有问题吗?

在构造函数和析构函数中调用虚函数时要小心。它们不会像往常一样被覆盖。A(..)~A()总是调用A::decompose。我想编译器在抱怨它找不到这个函数

这个错误是由于在BC析构函数中调用A::decompose引起的。即使析构函数是虚函数且方法本身是虚函数,也会调用A::decompose。当对派生对象BC运行A析构函数时,对象的派生部分已被销毁。

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;
    }

编制示例

编译示例(解决方案)

在基类中创建A::decompose函数的实现

virtual void decompose(){};