示例代码:
#include <string>
namespace vehicle
{
class Vehicle
{
public:
Vehicle(int a);
virtual ~Vehicle(); <------ not method?
protected:
int a;
};
}
另外,我没有完全理解纯虚方法的概念,你将方法声明为:
virtual method() = 0;
为什么我们需要这个?
答案 0 :(得分:1)
虚拟〜车辆();
代字号~
表示析构函数。这是一种方法,一种破坏对象的特殊方法。
虚拟析构函数用于抽象基类。
虚方法()= 0;
这是纯粹的虚拟功能。它表示您必须为实现此抽象基类的实现类提供实现method
。
答案 1 :(得分:1)
我们假设有两个类:Base
和Derived
struct Base
{
Base() {}
virtual void foo() = 0;
virtual ~Base()
{
std::cout << "Base descructor" << std::endl;
}
};
struct Derived : Base
{
int *i;
Derived(int i_): Base(), i(new int[i_]) {}
virtual void foo() override
{
std::cout << "foo" << std::endl;
}
virtual ~Derived()
{
std::cout << "Derived descructor" << std::endl;
delete [] i;
}
};
如果Derived
未覆盖foo
函数,则可以创建Derived
类的实例。当您尝试时,您的代码将无法编译,因为foo
是纯虚函数。
错误:抽象类类型'Derived'
的new-expression无效注意:因为以下虚拟函数在'Derived'中是纯粹的:
struct Derived : Base
纯虚函数用于描述接口。
~
(tilda)符号用于表示类析构函数。它 是一个特殊的方法,在对象被销毁时调用。
客户端创建Derived的实例:
Base *instance = new Derived;
然后以某种方式使用此变量,当您不需要变量时,您需要释放内存:
delete instance;
让我们跟踪电话:
派生的descructor
Base descructor
因此,您可以看到调用基本和派生的析构函数,并且不会发生内存泄漏。但是,如果您从析构函数中删除此virtual
关键字
Base descructor
正如您所看到的,Derived的descturtor未被调用,因此存在内存泄漏(Derived类的数组不会被释放)。
因此,当您通过指针处理对象时,虚拟构造函数非常有用。