很显然,你再次使用垃圾收集的垃圾填埋场语言,如 Java。 从这个角度看,回答这个问题可能是有益的。
当你写文章时
Base b = new Derived1();
在 Java,情况如下:
- A pointer "
&b
" (I ll call it β
) to a generic Base
object is allocated on the stack
- A new
Derived1
object (I ll call it d
) is allocated on the heap
β
is set to point at the Derived
object.
你很容易在 Java离开的原因是有一个垃圾收集器。 只要<条码>β<>>>><>>>> /代码>在“条码”和“条码”(<>d条码>上,该数值就具有任何效力,因为当时《GC》知道<条码>d<<>>>>> > ><<<>>>> > > > 仍在使用之中。 但只要无点人提及<条码>d条码>,则(例如,由于你宣布<条码>b条码>的功能,则允许GC释放由<条码>d条码>占用的空间。 简便,但垃圾收集有severalvant ,我们在C++中并不需要。
因此在C++中,如果你做这样的事情的话。
Base* b = new Derived1();
直接与 Java版本相对应的是:当b
>离开范围时,再不提<>d,但仍然位于[上。 页: 1
delete b;
(指出这具有你可以准确确定何时将其删除的巨大优势,而停车场收集器可以长时间无用地将其抛在一边,并且只有在你开始忘掉记忆时才会抹去。) 但这再次是不够的:与垃圾收集器不同,你的方案并不自动知道<条码>b>条码>至<条码>的点。 物体而不是Base
Object, so delete
删除时将考虑其处理。 页: 1 但很容易做到:在<条码>中包含一个虚拟脱轨器。 页: 1
class Base{
public:
virtual void func1() = 0;
virtual ~Base() {}
};
现在,用手方式删除所有物品显然是危险的:如果你忘记这样做的话,你就会有记忆泄露,即只要你的节目运行,就将物体never除去。 因此,应当使用smart Pointers而不是简单的C类点,这样就自动删除了它们在离开范围时指明的物体。 在C++11中,这些定义在标准图书馆中界定(标题<memory>
)。 你们
std::unique_ptr<Base> b(new Derived1());
现在,在<条码>b条码>离开范围时,自动删除<条码>。
在所有这些例子中,将虚拟功能称作“虚拟功能”以同样方式运作:
b->func1();