Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++对象模型中添加元类级别 有人能解释一下C++对象模型的这个理论问题吗?那是在我最近的一次考试中,我被它难住了_C++_Garbage Collection_Metaclass_Virtual Destructor_Object Model - Fatal编程技术网

在C++对象模型中添加元类级别 有人能解释一下C++对象模型的这个理论问题吗?那是在我最近的一次考试中,我被它难住了

在C++对象模型中添加元类级别 有人能解释一下C++对象模型的这个理论问题吗?那是在我最近的一次考试中,我被它难住了,c++,garbage-collection,metaclass,virtual-destructor,object-model,C++,Garbage Collection,Metaclass,Virtual Destructor,Object Model,问题: 注意到java、C和SimultAcess的成功,C++标准委员会决定向语言的对象模型添加一个附加的级别。也就是说,每个类都应该有一个在运行时具有表示的元类 反对者说,这与语言的一个基本原则相矛盾。哪一个解释一下 反对者还声称C++有一个额外的半级,允许完全的元类级的一些功能。这半关是什么?什么样的级别享受它的功能 支持者们提出了一个获胜的论点。添加一个级别将为标记和清除垃圾收集中的标记阶段提供支持,在该阶段中,首先标记所有可访问的对象,然后释放不可访问的对象。他们的论点所依赖的附加层面

问题: 注意到java、C和SimultAcess的成功,C++标准委员会决定向语言的对象模型添加一个附加的级别。也就是说,每个类都应该有一个在运行时具有表示的元类

反对者说,这与语言的一个基本原则相矛盾。哪一个解释一下

反对者还声称C++有一个额外的半级,允许完全的元类级的一些功能。这半关是什么?什么样的级别享受它的功能

支持者们提出了一个获胜的论点。添加一个级别将为标记和清除垃圾收集中的标记阶段提供支持,在该阶段中,首先标记所有可访问的对象,然后释放不可访问的对象。他们的论点所依赖的附加层面的特征是什么

此外,支持者还提出了另一个论点。附加级别将使虚拟析构函数冗余,即使没有垃圾收集系统。解释何时需要虚拟析构函数以及为什么需要虚拟析构函数,以及额外的级别如何消除该要求


由于我没有参加你的课程,我只能猜测:

1:C++是乐高工具包,你可以拿走你需要的东西,你可以把其他东西都留下。你也不用付钱。添加这个额外的级别需要一些初始化和东西,我想你不能选择不使用它-即使你不需要它

2:vtable类的RTTI

3:这里我只能猜测——我假设一个类的所有实例都可以通过某种方式被元类访问,或者可以通过扫描内存来检测。如果是这种情况,可以实现标记和扫描


4:如果通过具有基类类型的指针销毁类实例,则需要虚拟析构函数。如果可以从每个实例访问元类,那么就可以调用正确的析构函数,而无需在vtable中查找它。

解释哪些部分?你明白什么,你不明白什么?你会怎么回答?如果你对这个问题的答案是我不知道该回答什么,那么向你解释这个问题需要教大量的C++,因此这个问题的方式太宽了,以至于你不能在考试过程中回答这个问题。很公平。但是你现在拥有了所有可以使用的资源,包括完整的互联网。你自己在回答这些问题上取得了多大的进步?实际上我在考试中回答了其中一些问题。我相信问题1是关于C++是静态类型的,因此,元代码运行时的恶意代码会违反这个原则。对于2,我回答C++中的模板/泛型可以提供这种半级功能。第三部分和第四部分是我有点迷茫的地方。虽然这个问题稍微超出了这个范围,但我还是想读一些有教育意义的、彻底的答案+1.我还认为你接受答案的速度太快了,没有我说的那么详细hoped@Dariusz你可以在评论中提问,我可以试着回答。我想你大概是对的,关于2,3,4。对于1,C++可能是静态类型的,而元代码违反了这一点吗?我认为你对1的回答也是正确的,只是不确定这是否是他们想要的。我不认为元类违反了静态类型。它们只是RTTI的一个增强版本,已经允许动态_cast。但它与smalltalk不同,smalltalk在运行时查询类型以检查是否可以调用方法。