-
接口类:不需要有CPP文件,因为它根本就没有要实现的代码,甚至连构造函数和析构函数都没有,也没有数据成员,只有纯虚函数。查看全部
-
接口类:仅含有纯虚函数的类叫做接口类。也就是说在这个类中,没有数据成员,只有成员函数,成员函数都是纯虚函数。接口类更多的表达一种能力或协议。查看全部
-
一)只有函数声明没有函数定义的虚函数叫做纯虚函数。 二)含有纯虚函数的类叫做抽象类。 三)抽象类不能用来实例化对象。 四)抽象类的子类也可以是抽象类。查看全部
-
纯虚函数的实现原理:纯虚函数在虚函数表中的函数指针值为零(无意义),纯虚函数是某个类的成员函数。 抽象类:包含纯虚函数的类叫做抽象类,不能实例化对象,抽象类的子类只有把抽象类的所有纯虚函数都做了实现子类才可以实例化对象。查看全部
-
纯虚函数:没有函数体同时在定义时函数名后加=0查看全部
-
一)C++中多态的实现是通过虚函数表实现的。 二)当类中有虚函数或者虚析构函数时都产生虚函数表。 三)每个类有一个虚函数表,该类的所有对象共用同一张虚函数表。 四)两张虚函数表中的指针可能指向同一个函数。查看全部
-
多态的情况下虚函数表指针在对象中所占据的内存位置是对象的前四个内存单元,后面才依次排列的是对象的其他数据成员。查看全部
-
C++中如果一个类一个数据成员都没有,那么这个类实例化的对象用一个内存单元来标明自己的存在。如果有数据成员,就不用这个内存单元来标记这个对象的存在了。查看全部
-
对象的地址:通过一个类实例化的一个对象,这个对象在内存当中占有的第一个内存单元的地址就是这个对象的地址。 对象成员的地址:当用一个类实例化一个对象之后,这个对象中可能与一个或多个数据成员,每一个数据成员所占据的地址就是这个对象的成员地址,对象的数据成员由于数据类型不同那么占据的内存大小也不同,地址也是不同的。 虚函数表指针:在具有虚函数的情况下实例化对象时,这个对象的第一个内存存储的是一个指针,即虚函数表的指针,占四个内存单元,因此我们可以通过计算对象的大小来证明指针的存在。查看全部
-
对象的大小:再累实例化出的对象当中,他的数据成员所占据的内存大小,(不包括成员函数)这就是对象的大小。查看全部
-
虚析构函数的实现{理论前提:执行完子类的析构函数后就会执行父类的析构函数}: 如果在父类中定义了虚析构函数,在父类的虚函数表当中就会有一个父类虚析构函数的函数指针,子类的虚函数表中也会产生一个子类析构函数的函数指针,指向子类的析构函数,如果我们使用父类的指针指向子类的对象,通过delete来接定义的这个父类的指针,就可以通过父类来找到子类的虚函数表指针,通过虚函数指针找到子类的虚函数表,从而找到子类的析构函数,从而执行子类的析构函数,然后在执行过子类的析构函数后执行父类的析构函数。查看全部
-
覆盖:父类和子类定义了同名虚函数,在子类的虚函数表中,子类的虚函数地址就会把原来的父类的虚函数地址给覆盖了。 隐藏:父类和子类出现了同名函数,父类的同名函数将进行隐藏。查看全部
-
当我们实例化子类的对象时,因为其并没有定义虚函数,但却从父类中继承了其虚函数,所以此时也会产生一个虚函数表(注意,这个虚函数表是子类的虚函数表,与父类的虚函数表储存在计算机的不同位置)但是,子类的虚函数表当中,虚函数表中的函数指针还是与父类的虚函数表指针值相同。 如果子类当中定义了与父类虚函数相同函数名的函数时,父类中实例化对象是不变的,子类的虚函数表是不变的,但是虚函数表中的函数指针指向自身同名函数的地址,从而覆盖了父类函数指针的值。如果通过父类的指针指向子类的对象就会通过子类的虚函数表指针找到虚函数表,通过子类虚函数表找到子类的虚函数的函数入口地址,从而执行子类当中的虚函数。查看全部
-
虚函数的实现:当我们实例化一个shape的对象时,在这个对象当中除了有声明的数据成员,还会有另外一个数据成员{虚函数表函数指针(也是一个指针,占有四个基本内存单元)顾名思义,它指向一个虚函数表}这个虚函数表会与shape类的定义同时出现,计算机中虚函数表也是占有一定的空间的。这个虚函数表指针的值就是虚函数表存储的起始位置。父类的虚函数表只有一个,通过父类实例化的所有对象虚函数表指针的值都相同,都是该类虚函数表的起始位置。虚函数表当中肯定定义了一个函数指针,这个函数指针就是相应虚函数的入口地址。查看全部
-
函数指针:指向函数的指针叫做函数指针。函数的本质是一段二进制的代码写在内存当中,通过一个指针,指向这段代码的开头,计算机就会从开头往下执行,直到函数的结尾,并通过指令返回回来。查看全部
举报
0/150
提交
取消