2011-03-22 75 views
4

我在AB.h文件有一个构造函数析构函数'AB ::〜AB()':
AC.h:错误:只有构造函数带有基础初始化符析构函数在C++

如果我使用〜AB();它说,我有虚函数,但我没有析构函数,我误解了哪里? 三江源

+0

感谢球员,现在我有我的教训,虚拟〜析构函数(){} – Xitrum 2011-03-22 14:34:01

回答

6

您收到错误和无关的警告。

错误是因为你使用了析构函数的初始值设定项,这是没有意义的,也不是有效的语法。

你想:

~AB() { } // destructor 

警告是因为你还没有宣布你的析构函数是虚拟的。Classes with virtual methods should have virtual destructors

virtual ~AB() { } 
9

使用初始化列表,如

AB : a_member(4),another_member(5) {} 

也只感(和允许)的构造 - 在析构函数,你不想初始化的事情。

除了这个明显的语法错误之外,编译器会发出警告,因为AB有一个virtual方法,但是也没有声明它的析构函数virtual。这是推荐因为以下的原因:

AB* ab = new SomethingDerivedFromAB(); 
delete ab; // calls only AB's dtor and not SomethingDeriveFromAB's unless AB declares its dtor virtual 
+1

呀,更改〜AB:我(0) {}到〜AB {} – AndyG 2011-03-22 14:15:30

+0

是的我知道我不必在析构函数中重新初始化,但是如果我删除它,编译器会说“虚函数但没有析构函数” – Xitrum 2011-03-22 14:16:05

+0

编辑来解释'virtual '东西。 – 2011-03-22 14:17:16

1

您应该使用virtual ~AB { }protected: ~AB { }为您析构函数。

成员初始化列表: var(whatever)用于构造对象,在析构函数中没有意义。

关于虚拟性的警告是因为一般情况下,如果你打算让你的类多态使用,你希望它也可以多态删除。或者使析构函数受到保护,以便不能从父指针中多态地销毁对象。

1

析构函数应该是虚拟的,因为您打算从这个类继承(methodA是虚拟的)。但是,这只是一个警告。

错误在于析构函数没有参数,显然没有初始值设定项。

virtual ~AB() {} 
1
class AB{ 
private: int i; 
public: 
AB:i(0){} 
virtual ~AB(){} 
virtual void methodA(unsigned int value) = 0 ; }; 
0

编译器警告你,当你在你的类有一个虚拟方法,你的析构函数不是虚拟的。这可能会导致问题,因为在程序中可能只有基本析构函数会被调用。

2

如果您有虚拟功能,这是一个指示该类是为了被分类。

如果您没有将析构函数声明为虚函数,那么具有指向基类的指针的人可以调用析构函数,该函数不会调用子类的析构函数,因为它不是虚析构函数。这种情况会使由子类管理的内存/项目处于不正常的状态,因为它们不会被正确清理。

要学习的经验是始终使析构函数为虚拟的,即使您已经提供了实现。

1

你缺少括号在析构函数初始化:吴

class AB 
{ 
private: 
    int i; 
public: 
    AB():i(0){} // <-- parentheses here 
    virtual ~AB() {} // <-- parentheses here 
    virtual void methodA(unsigned int value)=0; 
};