-
接口类可以被继承,不能实例化查看全部
-
仅含有纯虚函数的类,称之为接口类。在类中没有任何的数据成员,仅有成员函数,仅有的成员函数又都是纯虚函数。 接口类更多的是表达一个能力或者协议查看全部
-
如果不是分.h和.cpp文件写,记得在默认构造函数加上{}查看全部
-
只有函数声明没有函数定义的虚函数是纯虚函数。查看全部
-
虚函数:virtual double calcArea(){return 0;}<br> 纯虚函数:virtual double calcPerimeter() = 0; 纯虚函数在虚函数表中直接写为0,包含纯虚函数的类,就是抽象类。 纯虚函数无法调用,所以抽象类无法实例化对象 抽象类的子类也有可能是抽象类。抽象类的子类只有把抽象类当中的所有纯虚函数都做了实现,子类才可以实例化对象。查看全部
-
对象的大小是指数据成员所占的内存空间的大小,不包括成员函数查看全部
-
异常处理的三个关键字: tyr{ } catch(){} throw 常见的异常:数组下标越界、除数为0、内存不足 异常与多态的联系 定义一个接口类,再定义若干继承接口类的表示不同错误信息的子类 出错时抛出对应错误的子类,用接口类接收错误查看全部
-
RTTI运用条件:1、类有虚函数;2、有继承关系查看全部
-
起航—离港—封装—继承查看全部
-
#include <iostream> #include <stdlib.h> #include <string> using namespace std; /** * 定义动物类:Animal * 成员函数:eat()、move() */ class Animal { public: // 构造函数 Animal(){cout << "Animal" << endl;} // 析构函数 virtual ~Animal(){cout << "~Animal" << endl;} // 成员函数eat() virtual void eat(){cout << "Animal -- eat" << endl;} // 成员函数move() virtual void move(){cout << "Animal -- move" << endl;} }; /** * 定义狗类:Dog * 此类公有继承动物类 * 成员函数:父类中的成员函数 */ class Dog : public Animal { public: // 构造函数 Dog(){cout << "Dog" << endl;} // 析构函数 virtual ~Dog(){cout << "~Dog" << endl;} // 成员函数eat() virtual void eat(){cout << "Dog -- eat" << endl;} // 成员函数move() virtual void move(){cout << "Dog -- move" << endl;} }; int main(void) { // 通过父类对象实例化狗类 Animal *p = new Dog(); // 调用成员函数 p->eat(); p->move(); // 释放内存 delete p; p = NULL; return 0; }查看全部
-
通过父类对象实例化子类:Animal *p = new Dog();查看全部
-
在C++中多态的实现是通过虚函数表实现的 每个类只有一份虚函数表,所有该类的对象共用同一张虚函数表 两张虚函数表中的函数指针可能指向同一个函数。 当类中仅含有虚析构函数,不含其它虚函数时,也产生虚函数表查看全部
-
即使没有数据成员,加入virtual之后,实例化对象,就会有虚函数表指针,该指针占4个基本内存单元,就不像之前只占一个基本内存单元了 虚函数表指针在对象当中的前4个基本内存单元查看全部
-
对象的大小:指的是数据对象所占内存的大小,不包括成员函数 虚函数表的指针在有虚函数的时候并且实例化对象的时候,这个对象的第一块内存当中所存储的是一个指针,就是虚函数表的指针 某类中一个对象成员都没有的时候,这个类也是可以实例化的,实例化之后,作为一个对象来说,级必须标明自己的存在,C++用一个内存单元去标记它,即为这个内存单元只标记了这个对象的存在。如果有数据成员,能够标记自己的存在,就不需要额外的内存单元去标记查看全部
-
指针指向对象,就叫对象指针,指针也可以指向函数 函数的本质就是一段二进制的代码,写在内存当中,可以通过指针指向这段代码的开头,计算机就会从头执行到尾,最后通过指令返回回去 函数的指针本质上和普通的指针是一样的,存储内存的地址,即为函数的首地址。 虚函数表指针指向虚函数表,虚函数表也是占有一定空间的 函数的隐藏:如果定义了父类和子类,父类和子类出现了同名函数,此时即为函数的隐藏。 函数的覆盖:如果没有在子类中定义同名的虚函数,在子类虚函数表中就会写上父类的那个相应的虚函数的函数入口地址;如果在子类中也定义了同名的虚函数,在子类的虚函数表中就会把原来父类的虚函数的入口地址覆盖一下,覆盖成子类的虚函数的函数地址 虚析构函数的实现原理:父类中定义了虚析构函数,父类的虚函数表中就会有析构函数的函数指针,而在子类虚函数表中也会产生一个子类的析构函数的函数指针,指向的是子类的析构函数。此时使用父类的指针指向子类的对象,就可以通过父类找到虚函数表指针,进而找到虚函数表,通过虚函数表,找到子类的析构函数,从而使得子类的析构函数得以执行。子类的析构函数执行完毕之后,系统会自动执行父类的析构函数。查看全部
举报
0/150
提交
取消