类一定有基类?编程语言的基类型?基类?明明是一个通用指针类型, 为什么运行期可以找到正确的类对象?多继承的困扰?

类一定有基类?

不是所有的牛奶都叫特仑苏,也不是所有的类都有基类。

  • C++默认情况下不限定类一定有一个原始基类,C++这种处于C和纯面向对象的设计使得它格外有选择权。
  • 对于Smalltalk/ObjC/Java/C#/Eiffel/Python默认一定有原始基类,即使语言允许不指定基类,编译器也会默认加上。
    • 例如Python中,定义一个空类,用内置函数dir查看它有哪些属性和方法。

编程语言的基类型

大多数面向对象编程语言抽象基类型基本都千篇一律,编程语言也逃脱不了自然界的基本抽象。

  • C/C++ 没有基类型。
  • ObjC 抽象出NSObject类型。
  • C#/Java 基类型是Object.
  • Kotlin 用Any指代所有非空类型的超类型。

void *

尽管它可以指代任何类型,编程语言一般不把它当做基类型,它只是作为通用类型参数传递的方式。

基类

不是所有的牛奶都叫特仑苏,也不是所有的类都有基类。

类一定有基类?

  • C++默认情况下不限定类一定有一个原始基类,C++这种处于C和纯面向对象的设计使得它格外有选择权。
  • 对于Smalltalk/ObjC/Java/C#/Eiffel/Python默认一定有原始基类,即使语言允许不指定基类,编译器也会默认加上。
    • 例如Python中,定义一个空类,用内置函数dir查看它有哪些属性和方法。

基类的代号

  • Java: super.
  • C++和Eiffel必须用父类名因为支持多继承,super无法明确属于哪个基类。

修改根类

  • ObjC允许修改根类,即自定义一套新的NSObject类。

明明是一个通用指针类型, 为什么运行期可以找到正确的类对象?

不管是ObjC的id类型,还是C++基类指针,运行期可以正确找到对应的父类或者子类,根源在二者都有一套查找到正确对象的机制。

  • ObjC运行时可以方便跟踪对象所属的类,即每个NSObject都有一个isa成员,指向对应的类。
  • C++虽然没有运行时执行查找类对象所属类,但它利用虚函数表在编译期进行巧妙的覆盖,达到运行期找到正确的"虚函数"的目的。

多继承的困扰

  • 小明有时很困扰,自己的脾气很倔,妈妈说这像他爸,他爸说像他姥姥,大家都要面子,一家人吵的不可开交。
  • 有人说自己是朱元璋18代后代,列出长相哪里哪里像,与第X代和第Y代的某个祖先比较像,大部分人无法分辨,因为继承太长了,溯源也找不到实证。

C++多继承的设计其实会产生极为复杂的结果,当继承层数超过3,应该调用哪一个基类的哪个函数就可能不好分辨了。大部分更现代的编程语言,都不支持多继承。

  • ObjC只有单继承,但利用protocol实现多重接口继承。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

你可能感兴趣的:(编程语言,小话c++,小话ios,java,jvm,开发语言,c语言,c++,ios,objective-c)