-
delete shape; 先执行子类的析构函数,再执行父类的析构函数查看全部
-
编译器在执行过程中遇到virtual关键字,会建立一张虚函数表,同时在每个带有虚函数的类中放置指向虚函数表的指针v_ptr. 实例化带有虚函数类的对象时,为v_ptr分配内存,并置于对象的起始地址. shape(父类)的指针指向Circle(子类)的对象,通过Circle的v_ptr指针找到Circle的虚函数表,从而找到Circle的虚函数的函数地址.查看全部
-
接口类查看全部
-
抽象类不允许实例化查看全部
-
抽象类查看全部
-
typeid注意事项 2.若不带有虚函数,则只能返回定义时所使用的数据类型 3.即便这个类含有虚函数,也只能判断当前对象是基类还是子类,没有办法判断当前指针是基类还是子类查看全部
-
if(typeid(*obj)==typeid(Bird)) { Bird *dynamic_case<Bird *>(obj); bird->foraging(); }查看全部
-
A 只有函数声明没有函数定义的虚函数是纯虚函数。 B 含有纯虚函数的类叫做抽象类。 C 不可以使用含有纯虚函数的类实例化对象。 D 抽象类的子类也可以是抽象类。查看全部
-
typeid(*obj).name()查看全部
-
仅含有纯虚函数的类称为接口类。没有数据成员,只有成员函数,且成员函数都是纯虚函数。 接口类似一种协议或者能力。 想实例化子类,需要在子类中实现继承来的接口类。查看全部
-
虚函数:virtual double calcArea(){return 0;}<br> 纯虚函数:virtual double calcPerimeter() = 0; 纯虚函数在虚函数表中直接写为0,包含纯虚函数的类,就是抽象类。 纯虚函数无法调用,所以抽象类无法实例化对象 抽象类的子类也有可能是抽象类。抽象类的子类只有把抽象类当中的所有纯虚函数都做了实现,子类才可以实例化对象。 抽象基类是本类族的公共接口,例如可通过抽象基类的指针访问到任何子类的虚函数,并对这些函数下达同一命令,从而实现多态性。 若是子类并没有对父类中的纯虚函数进行定义,则该子类仍然是抽象基类。查看全部
-
A 在C++中多态的实现是通过虚函数表实现的 B 当类中仅含有虚析构函数,不含其它虚函数时,也会产生虚函数表 C 每个类只有一份虚函数表,所有该类的对象共用同一张虚函数表 D 两张虚函数表中的函数指针可能指向同一个函数。查看全部
-
抽象类 抽象类不容许实例化对象 抽象类的子类也可能时抽象类查看全部
-
1. delete释放指针时: 若delete后面是父类对象,则只会执行父类的析构函数; 若delete后面是子类对象,则会先执行子类的析构函数在执行父类的析构函数。 针对上面的情况,若父类指针p1指向派生类对象,恰好派生类中存在指针成员p2且在派生类的构造函数中对此指针p2进行了new运算申请了内存空间,那么在进行delete p1时,就有可能造成内存泄露(p2的空间没有释放)。因此,引入虚析构函数——先析构派生类再析构父类。 2. 虚不是所有函数都能“虚的”: 内联函数不能是虚函数, 静态函数不能是虚函数, 构造函数不能是虚函数, 不是类的成员函数不能是虚函数,即普通函数不能是虚函数查看全部
-
1. 每个类的头文件中都加上宏定义,防止出现类重定义现象 2. 子类继承父类的时候,也要把父类本身的头文件加上查看全部
举报
0/150
提交
取消