从设计的角度来看,为什么在C++中没有万物之母的基类,在其他语言中object通常是什么?
发布于 2011-04-18 08:11:51
最终的裁决可以在Stroustrup's FAQs中找到。简而言之,它没有传达任何语义。这将是有代价的。模板对于容器更有用。
为什么C++没有通用的类对象?
使用通用基类的
发布于 2011-04-18 08:26:44
让我们首先考虑一下为什么要有一个基类。我可以想到几个不同的原因:
这是Smalltalk、Ruby和Objective-C品牌的语言拥有基类的两个很好的原因(从技术上讲,Objective-C并没有真正的基类,但无论出于何种意图和目的,它都有)。
对于#1,通过在C++中包含模板,消除了对统一单个接口下的所有对象的基类的需求。例如:
void somethingGeneric(Base);
Derived object;
somethingGeneric(object);是不必要的,当你可以通过参数多态的方式一直保持类型的完整性!
template <class T>
void somethingGeneric(T);
Derived object;
somethingGeneric(object);对于#2,在Objective-C中,内存管理过程是类实现的一部分,并且是从基类继承的,而C++中的内存管理是使用组合而不是继承来执行的。例如,您可以定义一个智能指针包装器,它将对任何类型的对象执行引用计数:
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++没有基类,因为通过模板具有参数多态性,所以它不需要基类。
发布于 2011-04-18 08:21:10
C++变量的主要范例是按值传递,而不是按引用传递。强制所有内容都派生自根Object将使通过值传递它们本身成为一个错误。
(因为通过值接受对象作为参数,根据定义会将其切分并移除其灵魂)。
这是不受欢迎的。C++让您考虑是需要值语义还是引用语义,让您可以选择。这是性能计算中的一件大事。
https://stackoverflow.com/questions/5697328
复制相似问题