-
多态的概念
查看全部 -
面向对象的三大特征: 1.封装 2.多态 3.继承
查看全部 -
父类函数如果用virtual修饰了,那么当子类重载了该函数时,会默认加上virtual关键字;
父类析构函数如果用virtual修饰了,那么子类析构函数会默认加上virtual关键字;基于此,当父类指针指向子类对象时,如果delete父类指针时,会优先调用子类的虚析构函数,然后自动调用父类的虚析构函数。查看全部 -
包含虚函数或虚析构函数的类,会隐藏含有一个虚函数表指针的属性,该指针指向虚函数表,虚函数表指针也是一个指针,占有4个基本内存单元;
虚函数表是与类同时出现的,也就是说多个对象共享同一个虚函数表,虚函数表存储虚函数的入口地址;
如果父类中有虚函数,子类中没有定义虚函数,那么子类也会有一份自己的虚函数表,原因是子类可以从父类中继承虚函数,因此也需要维护一份虚函数表;
如果子类重新实现了父类的虚函数,那么子类会将该虚函数的指针在子类的虚函数表里覆盖父类的同名虚函数,此时如果用父类指针指向子类对象,这时子类的虚函数表指针属性会覆盖父类的虚函数表指针,因此会调用到子类的虚函数。
查看全部 -
virtual在函数中的使用限制:
· 普通函数不能是虚函数 virtual int test(){}
· 静态成员函数不能是虚函数 virtual static int getCount();
· 内联函数不能是虚函数 inline virtual int eat();
· 构造函数不能为虚函数
class Animal
{
public:
virtual Animal()
{
}
};
查看全部 -
思想:主逻辑和异常处理分离
try...catch...catch...catch......
常见异常
数组下标越界
除数为0
内存不足(多数内存泄露造成)
查看全部 -
dynamic_cast<Bird *>(obj)
只能用于指针和引用的转换
转换的类型必须包含虚函数,否则失败
查看全部 -
纯虚函数 没有函数体 函数名之后加=0;
含有纯虚函数的类叫抽象类
抽象类不能实例化对象
查看全部 -
函数覆盖:派生类的虚函数覆盖掉基类的虚函数
函数隐藏:同名函数
查看全部 -
虚析构函数解决可能出现的内存泄露问题
普通函数不能是虚函数,不能修饰static成员函数,不能修饰内联函数,不能修饰构造函数
查看全部 -
typeid 使用前包含库#include <typeinfo>
dynamic_cast<需转化类型>(被转化类型)
(只能用于转化指针类或引用)
查看全部 -
面向对象三大特征
查看全部 -
#include <iostream>
#include <stdlib.h>
#include <string>
#include<typeinfo>
using namespace std;
/**
* 定义移动类:Movable
* 纯虚函数:move
*/
class Movable
{
public:
virtual void move()=0;
};
/**
* 定义公交车类:Bus
* 公有继承移动类
* 特有方法carry
*/
class Bus : public Movable
{
public:
virtual void move()
{
cout << "Bus -- move" << endl;
}
void carry()
{
cout << "Bus -- carry" << endl;
}
};
/**
* 定义坦克类:Tank
* 公有继承移动类
* 特有方法fire
*/
class Tank :public Movable
{
public:
virtual void move()
{
cout << "Tank -- move" << endl;
}
void fire()
{
cout << "Tank -- fire" << endl;
}
};
/**
* 定义函数doSomething含参数
* 使用dynamic_cast转换类型
*/
void doSomething(Movable *obj)
{
obj->move();
if(typeid(*obj)==typeid(Bus))
{
Bus *bus=dynamic_cast<Bus *>(obj);
bus->carry();
}
if(typeid(*obj)==typeid(Tank))
{
Tank *tank=dynamic_cast<Tank*>(obj);
tank->move();
tank->fire();
}
}
int main(void)
{
Bus b;
Tank t;
doSomething(&b);
doSomething(&t);
return 0;
}查看全部 -
异常处理:
关键字
try ...catch...
throw
查看全部 -
RTTI:运行时类型识别
dynamin_cast只能应用于指针和引用的转换,要转换的类型中必须包含虚函数,若转换成功则返回子类的地址,失败返回NULL.
type_id返回一个type_info对象的引用,如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数, 只能获取对象的实际类型。
查看全部
举报