我的程序中有三个班级,
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
这段代码有问题吗?
答案 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;
}