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

时间:2014-03-30 22:40:39

标签: c++ oop undefined-reference

我的程序中有三个班级,

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和{{1 }}

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

.cpp

这段代码有问题吗?

3 个答案:

答案 0 :(得分:2)

小心在构造函数和析构函数中调用虚函数。它们不像往常一样被覆盖。 A(..)~A()始终致电A::decompose。我认为编译器抱怨它无法找到这个功能。

答案 1 :(得分:1)

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

virtual void decompose(){};

答案 2 :(得分:1)

错误是由于在 B C 析构函数中调用A::decompose引起的。即使析构函数是虚拟的而且方法本身是虚拟的,也会调用A::decompose。当 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)

相关问题