-
virtual使用的限制
查看全部 -
在多态的情况下虚函数表指针在对象当中所占据的内存位置是每个对象的前四个基本内存单元
查看全部 -
接口类:
类中仅含有纯虚函数
作用:表达一种能力或协议
查看全部 -
纯虚函数:
含有纯虚函数的类叫做抽象类。
1、抽象类无法实例化对象
2、抽象类的子类只有把父类所有纯虚函数都做了抽象,才可以实例化对象。
查看全部 -
typeid注意事项:
type_id返回一个type_info对象的引用
如果通过基类的指针获得派生类的数据类型,基类必须带有虚函数
只能获取对象的实际类型
查看全部 -
dynamic_cast注意事项:
只能应用与指针和引用的转换
要转换的类型中必须包含虚函数
转换成功返回子类的地址,失败返回NULL
查看全部 -
对象的大小是指在类实例化出的对象当中,他的数据成员所占据的内存大小,而不包括成员函数
查看全部 -
如果基类的析构函数是虚函数,这时只会看p所赋值的对象,如果p赋值的对象是派生类的对象,就会调用派生类的析构函数(毫无疑问,在这之前也会先调用基类的构造函数,在调用派生类的构造函数,然后调用派生类的析构函数,基类的析构函数,所谓先构造的后释放);如果p赋值的对象是基类的对象,就会调用基类的析构函数,这样就不会造成内存泄露。
如果基类的析构函数不是虚函数,在delete p时,调用析构函数时,只会看指针的数据类型,而不会去看赋值的对象,这样就会造成内存泄露。
查看全部 -
1、多态
定义:指相同对象收到不同消息 或 不同对象收到相同消息时产生的不同动作
2、静态多态(早绑定) 和 动态多态(晚绑定)
静态多态:
(1)virtual 作用就是父类的指针指向子类的对象
(2)建立在继承的基础上 子类可以写关键字 virtual 也可以不加,不加系统会自动添加(代码的可读性给加上)
(3)有new 就得有 delete
查看全部 -
面向对象的三大特征之一
1、啥事多态(1到多)
2、虚函数(纯虚函数 -- 抽象类接口类 )
普通虚函数 虚析构函数
3、RTTI(运行时类别识别)
4、隐藏 覆盖
5、早绑定 晚绑定
6、异常处理
查看全部 -
virtual在函数中的使用限制:
·普通函数不能是虚函数(编译错误)
· 静态成员函数不能是虚函数(编译错误)
·内联函数不能是虚函数(可编译,编译器忽略inline关键字是函数变为纯粹虚函数)
·构造函数不能是虚函数(编译错误)
查看全部 -
通过虚析构函数解决动态多态内存泄漏问题
查看全部 -
定义一个动物(animal)类,要求含有虚函数eat和move,并定义构造函数和虚析构函数
定义一个狗(Dog)类,要求共有继承动物类,定义构造函数和虚析构函数,并实现自己的eat和move函数使用父类对象实例化子类,调用子类成员函数
#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;
}
查看全部 -
在某一个类的定义中,其构造函数中申请内存,即存在"has a"的情况,析构函数中释放内存。
如果在使用该类时涉及多态状况,则会发生内存泄漏,因为析构函数中的释放内存没有被运行到。
——虚析构函数:用virtual去修饰析构函数
!1!普通函数不能是虚函数,函数必须是某个类的成员函数
!2!静态的成员函数不能是虚函数
!3!内联函数不能是虚函数
!4!构造函数不能是虚函数
查看全部 -
静态多态(早绑定):成员函数同名,但参数数目不同时,调用成员函数使用的参数个数决定了启用不同的成员函数。
动态多态(晚绑定):以封装和继承为基础,父类指针指向子类类型时,要用virtual去修饰子类中已经重定义的成员函数(虚函数),否则使用的是父类的定义的成员函数;子类中的同名成员函数virtual可加可不加,系统默认补全。
”父类指针指向子类对象,通过父类指针只能寻址到从父类继承到的成员函数与数据成员,子类扩展的将会被截断。但是,如果将父类中同名函数设置为虚函数,创建子类对象时将会创建子类自有的虚函数表,虚函数表指向的成员函数将覆盖父类中的同名函数。“
查看全部
举报