首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++和Java :虚拟基类的使用

C++和Java :虚拟基类的使用
EN

Stack Overflow用户
提问于 2010-08-23 06:09:37
回答 4查看 6.5K关注 0票数 5

在比较C++和Java多重继承时,我有一些疑问。

  1. 甚至
  2. 都通过接口使用多个、多层次的继承,但是为什么不像C++那样使用类似于虚拟基类的东西呢?是因为java接口的成员在内存中得到了一个副本(它们是公共的静态最终版本),而方法只被声明而没有定义吗?
  3. 除了节省内存之外,C++中还有其他虚拟类的用途吗?如果我忘记在我的多个继承程序中使用这个特性,还有什么要注意的吗?
  4. 这个有点哲学--但是为什么C++开发人员没有将每个基类都变成一个默认的虚拟类呢?提供灵活性的需要是什么?

将不胜感激。谢谢!!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-23 06:20:20

1) Java接口没有属性。在c++中使用虚拟基类的原因之一是防止重复属性以及与此相关的所有困难。

2)在c++中使用虚拟基类至少会造成轻微的性能损失。此外,构造函数变得如此复杂,因此建议虚拟基类只有无参数构造函数。

( 3)正是因为c++的哲学:一个人不应该要求对一个人可能不需要的东西进行惩罚。

票数 3
EN

Stack Overflow用户

发布于 2010-08-23 06:29:44

  1. 对不起--不是一个Java程序员,细节太短了。不过,虚拟库是多重继承的一种改进,Java设计人员总是为之辩护,因为它过于复杂,而且可以说error-prone.
  2. virtual库不仅仅是为了节省内存--数据是由从它们继承的不同对象共享的,因此这些派生类型可以用它来协调它们的行为。它们通常不那么有用,但作为一个例子:对象标识符,其中您希望每个派生对象都有一个id,而不是计数所有的子对象。另一个例子是:确保乘法派生类型可以明确地映射/转换为指针到基类型,使其易于在基类型上操作的函数中使用,或者存储在base *的容器中。
  3. 作为C++的容器目前已标准化,从两个类派生出来的类型通常可以期望它们独立操作,并且这种类型的对象在堆栈或堆上创建时往往会这样做。如果一切都是虚拟的,那么突然间,独立性就变得高度依赖于它们的派生类型--所有类型的交互都成为默认的,派生本身就变得不那么有用了。所以,您的问题是,为什么不使默认的虚拟-嗯,因为它是不那么直观,更危险和错误的两种模式。

票数 3
EN

Stack Overflow用户

发布于 2010-08-23 09:44:40

1.接口中的Java多重继承行为与C++中的虚拟继承最为相似。更准确地说,要在c++中实现类似java的继承模型,您需要使用c++虚拟基类。

然而,c++虚拟继承(小内存和性能损失除外)的缺点之一是static_cast<>无法从基到派生,因此需要使用rtti (dynamic_cast) (或者如果预先知道子类的列表,可以为子类提供手工制作的虚拟转换功能)。

2.如果在继承列表中忘记了“虚拟”限定符,这通常会导致编译器错误,因为从任何驱动到基类的转换都会产生矛盾。

3.哲学问题通常难以回答.c++是一种多范式(多哲学)语言,不强加任何哲学决定。您可以在您自己的项目中尽可能使用虚拟继承,并且(您很成熟)它有一个很好的理由。但是这样的极大值对于其他人来说可能是不可接受的,所以通用的c++工具(标准和其他广泛使用的库)应该(如果可能的话)不受任何特定的哲学惯例的影响。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3545080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档