首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么C++中没有基类?

为什么C++中没有基类?
EN

Stack Overflow用户
提问于 2011-04-18 08:01:58
回答 6查看 10.8K关注 0票数 88

从设计的角度来看,为什么在C++中没有万物之母的基类,在其他语言中object通常是什么?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-04-18 08:11:51

最终的裁决可以在Stroustrup's FAQs中找到。简而言之,它没有传达任何语义。这将是有代价的。模板对于容器更有用。

为什么C++没有通用的类对象?

  • 我们不需要:泛型编程在大多数情况下提供了静态类型安全的替代方案。其他情况则使用多重继承进行处理。

  • 没有有用的通用类:真正的通用类本身没有语义。

  • “通用”类鼓励对类型和接口的草率思考,并导致过多的运行时检查。

使用通用基类的

  • 意味着开销:对象必须是堆分配的才能是多态的;这意味着内存和访问开销。堆对象本身并不支持复制语义。堆对象不支持简单的作用域行为(这会使资源管理复杂化)。通用基类鼓励使用dynamic_cast和其他运行时检查。
票数 117
EN

Stack Overflow用户

发布于 2011-04-18 08:26:44

让我们首先考虑一下为什么要有一个基类。我可以想到几个不同的原因:

  1. 支持将在任何类型的对象上工作的泛型操作或集合。
  2. 包括对所有对象通用的各种过程(例如,内存as是一个对象(没有原语!)。一些语言(比如Objective-C)没有这个功能,这使得事情变得相当混乱。

这是Smalltalk、Ruby和Objective-C品牌的语言拥有基类的两个很好的原因(从技术上讲,Objective-C并没有真正的基类,但无论出于何种意图和目的,它都有)。

对于#1,通过在C++中包含模板,消除了对统一单个接口下的所有对象的基类的需求。例如:

代码语言:javascript
复制
void somethingGeneric(Base);

Derived object;
somethingGeneric(object);

是不必要的,当你可以通过参数多态的方式一直保持类型的完整性!

代码语言:javascript
复制
template <class T>
void somethingGeneric(T);

Derived object;
somethingGeneric(object);

对于#2,在Objective-C中,内存管理过程是类实现的一部分,并且是从基类继承的,而C++中的内存管理是使用组合而不是继承来执行的。例如,您可以定义一个智能指针包装器,它将对任何类型的对象执行引用计数:

代码语言:javascript
复制
template <class T>
struct refcounted
{
  refcounted(T* object) : _object(object), _count(0) {}

  T* operator->() { return _object; }
  operator T*() { return _object; }

  void retain() { ++_count; }

  void release()
  {
    if (--_count == 0) { delete _object; }
  }

  private:
    T* _object;
    int _count;
};

然后,您将在对象的包装器中调用方法,而不是调用对象本身的方法。这不仅允许更通用的编程:它还允许您分离关注点(因为在理想情况下,您的对象应该更关心它应该做什么,而不是如何在不同的情况下管理它的内存)。

最后,在像C++这样既有原语又有实际对象的语言中,使用基类(用于每个值的一致接口)的好处就丧失了,因为这样你就有了不符合该接口的某些值。为了在这种情况下使用原语,您需要将它们提升到对象中(如果您的编译器不会自动执行此操作)。这造成了很多复杂的问题。

因此,对您的问题的简短回答是: C++没有基类,因为通过模板具有参数多态性,所以它不需要基类。

票数 44
EN

Stack Overflow用户

发布于 2011-04-18 08:21:10

C++变量的主要范例是按值传递,而不是按引用传递。强制所有内容都派生自根Object将使通过值传递它们本身成为一个错误。

(因为通过值接受对象作为参数,根据定义会将其切分并移除其灵魂)。

这是不受欢迎的。C++让您考虑是需要值语义还是引用语义,让您可以选择。这是性能计算中的一件大事。

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

https://stackoverflow.com/questions/5697328

复制
相关文章

相似问题

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