面向对象相关

重载、重写、重用
作用域:重载函数,它们的作用域相同;而重写和重用的函数作用域不同,出现在继承关系中。
重载:函数名必须相同,但是函数参数列表必须不同,返回值无所谓。
重写:函数名,参数列表和返回值类型都必须相同。出现于虚函数中,也叫覆盖。
重用:函数名相同即可,出现于派生类重用定义了其基类中的函数名字,也叫隐藏。可以通过作用域来调用被隐藏的函数。重用体现了C++中一条规则--名字查找先于类型检查。

基类作用域与派生类作用域
派生类作用域嵌套于基类作用域之内,所以派生类才可以像使用自己的成员一样使用基类成员(在派生类有访问权限的情况下)。

虚函数
重写机制与动态绑定--调用哪个虚函数由所调用者的类型(派生类还是基类)决定,即无法再编译时判断函数的函数体,智能在运行时判断。
虚函数不能被修饰为静态。
虚函数表的实现:
虚函数表由vtbl(virtual table)和vptr(virtual table pointer)组成。
vtbl通常为一个函数指针数组或者链表。
vtbl中虚函数按照声明顺序存储,如果派生类重写了其基类的虚函数,则在其vtbl中代替其父类的位置。
在多继承中,每个有虚函数的基类都有自己的vtbl,派生类的虚函数成员(非继承或重写)被放在第一个基类的vbtl之中。
在多继承中,派生类需要额外的4N字节的空间来存储虚函数表的指针,其中N为其所有基类中包含虚函数的个数。

虚继承
1. 虚基类的构造由最底层的派生类负责,在构造顺序当中,虚基类排第一,与其在继承体系中的位置无关。
2. 当出现多个虚基类时,这些虚基类的构造顺序与其位置有关。该位置与多重继承中的子树有关,其所属子树顺序高者则先构造。

多重继承
1. 名字查找在派生类的所有直接基类中同时进行,以每个直接基类为树根形成的子树;如果该查找在超过一个子树(以直接基类为根的子树)中找到,则出现二义性。
2. 二义性是合法的,如果没有调用具有二义性的成员函数,则不会出错。在派生类中定义一个新版本的该成员函数可以解决二义性问题。

名字查找
1. 范围查找(名字)类 > 基类 > 命名空间
2. 重载决议(形参)
3. 可访问性检测(访问)

影响类的大小的三个因素
1. 语言特性早餐的影响,如vtbl。
2. 编译器在特殊情况下的优化处理,如对于空类,编译器会为其对象分配一个字节来区别各个对象的地址。
3. 边界调整,通过对齐从而优化总线的传输效率。

阻止拷贝构造和赋值构造

时间: 2024-10-31 01:16:46

面向对象相关的相关文章

Java学习笔记<3>面向对象相关

面向对象的基本思想 从现实世界客观存在的事务出发来构造软件系统,并在系统的构造中尽可能运用人类的自然思维方式,如抽象.分类 继承.聚合.多态等. 类和对象的关系 对象中存储了类规定的数据类型,并且对象可以调用类的方法. java面向对象 <1>对象是java程序的核心,一切皆对象. <2>对象可以看成静态属性(成员变量)和动态属性(方法)的封装体. <3>类是创新同一类型对象的模版,定义了该类型对象应具有的成员变量及方法. 类的定义 成员变量可以用java语言的任何一种

Java之面向对象相关问题集

面向对象的特征有哪些方面  1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象. 3.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重

面向对象相关概述

第一章面向对象概述 一.结构化编程与面向对象编程的区别 在程序设计的早期,程序用流程图和自顶向下的方法设计.采用这种设计方法,程序员会将一个大的问题分解成更小的任务,然后为每个更小的任务编写一个过程(或函数).最后,程序员会编写一个主过程来启动程序流程,随后根据程序流程走向,调用想要的其它过程.这种类型的程序设计被称为结构化编程. 20世纪70年代以后,面向对象编程(Object Oriented Programming,简称OOP)开始流行.OOP采用了一种完全不同的方法来开发计算机应用程序.

python——面向对象相关

其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 2 3 4 5 6 class Foo(object):     pass obj = Foo() isinstance(obj, Foo) 二.issubclass(sub, super) 检查sub类是否是 super 类的派生类 1 2 3 4 5 6 7 class Foo(object):     pass class Bar(Foo):     pass issubclass(Bar,

php的面向对象相关特性

php的面向对象与java类似,主要涉及类的声明.命名空间的使用.构造函数.静态成员.类的封装.类的继承.方法的重写等: 1)类的声明:创建[hello.php] <?php //声明一个类 class Hello{ public function sayHello(){ echo 'hello myphp'; } } //一个文件中可存在多个类 class Desk{ public function work(){ echo 'work'; } } 创建[index.php] <?php r

假期(面向对象相关)

""" 一.isinstance(obj,cls) 和 issubclass(sub,super) isinstance(obj,cls) 检查obj是否是类cls的对象 class Bar(object): pass class Foo(object): pass obj = Foo() print(isinstance(obj,Foo)) #True print(isinstance(obj,Bar)) #False issubclass(sub,super) 检查sub

Python心得基础篇【7】面向对象相关

其他相关 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) 二.issubclass(sub, super) 检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class Bar(Foo): 5 pass 6 7 issubclass(Bar, Foo) 三.异常处理

Python 面向对象相关

1. 类基本定义 默认构造器为只有一个self参数,内容只有一行pass. 方法:  实例方法:以实例本身self作为第一个参数. 类方法:以类对象本身cls作为第一个参数,以@classmethod修饰. 静态方法:参数无要求,以@staticmethod修饰. 变量:  实例变量:以self.开头的变量. 类变量:在类定义后.方法外定义的变量. 变量的引用:  类变量: self.__class__.class_field_name:这种方法肯定成功. self.class_field_na

面向对象相关知识总结

//1.hasOwnPrototype 判断是都是当前对象的自有属性 var obj ={name:"zhangsan"}; console.log(obj.hasOwnProperty("name"));//true //2.isPrototypeOf 判断是否是传入对象的原型对象 functionFun(){} var fun=newFun(); console.log(Fun.prototype.isPrototypeOf(fun));//true //con