我在AB.h文件有一个构造函数析构函数'AB ::〜AB()':
AC.h:错误:只有构造函数带有基础初始化符析构函数在C++
如果我使用〜AB();它说,我有虚函数,但我没有析构函数,我误解了哪里? 三江源
我在AB.h文件有一个构造函数析构函数'AB ::〜AB()':
AC.h:错误:只有构造函数带有基础初始化符析构函数在C++
如果我使用〜AB();它说,我有虚函数,但我没有析构函数,我误解了哪里? 三江源
您收到错误和无关的警告。
错误是因为你使用了析构函数的初始值设定项,这是没有意义的,也不是有效的语法。
你想:
~AB() { } // destructor
的警告是因为你还没有宣布你的析构函数是虚拟的。Classes with virtual methods should have virtual destructors:
virtual ~AB() { }
使用初始化列表,如
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
您应该使用virtual ~AB { }
或protected: ~AB { }
为您析构函数。
成员初始化列表: var(whatever)
用于构造对象,在析构函数中没有意义。
关于虚拟性的警告是因为一般情况下,如果你打算让你的类多态使用,你希望它也可以多态删除。或者使析构函数受到保护,以便不能从父指针中多态地销毁对象。
析构函数应该是虚拟的,因为您打算从这个类继承(methodA是虚拟的)。但是,这只是一个警告。
错误在于析构函数没有参数,显然没有初始值设定项。
virtual ~AB() {}
class AB{
private: int i;
public:
AB:i(0){}
virtual ~AB(){}
virtual void methodA(unsigned int value) = 0 ; };
编译器警告你,当你在你的类有一个虚拟方法,你的析构函数不是虚拟的。这可能会导致问题,因为在程序中可能只有基本析构函数会被调用。
关于虚析构函数,见Rule of Three。
如果您有虚拟功能,这是一个指示该类是为了被分类。
如果您没有将析构函数声明为虚函数,那么具有指向基类的指针的人可以调用析构函数,该函数不会调用子类的析构函数,因为它不是虚析构函数。这种情况会使由子类管理的内存/项目处于不正常的状态,因为它们不会被正确清理。
要学习的经验是始终使析构函数为虚拟的,即使您已经提供了实现。
你缺少括号和在析构函数初始化:吴
class AB
{
private:
int i;
public:
AB():i(0){} // <-- parentheses here
virtual ~AB() {} // <-- parentheses here
virtual void methodA(unsigned int value)=0;
};
感谢球员,现在我有我的教训,虚拟〜析构函数(){} – Xitrum 2011-03-22 14:34:01