-
void dosomething(Flyable *obj)//传入bird或者plane的数据 { obj->takeoff();//调用起飞函数 cout<<typeid(*obj).name()<<endl;//打印传入数据的名字 if(typeid(*obj)==typeid(Bird))//判断传入的数据是不是Bird类 { Bird *bird = dynamic_cast<Bird *>(obj);//obj指针转换成bird指针 bird->foraging();//因为是bird,所以调用觅食(foraging)函数 } obj->land(); }查看全部
-
引用和指针才能转换查看全部
-
Ctrl+k+u 删除注释查看全部
-
纯虚函数查看全部
-
try&catch可以一对多 try{....}catch(){...}catch(){...}查看全部
-
异常处理:try{....}catch(){...}和throw的用法查看全部
-
dynamic_cast使用注意事项查看全部
-
typeid和dynamic_cast查看全部
-
使用虚析构函数的限制之四:构造函数不能是虚函数查看全部
-
使用虚析构函数的限制之三:内联函数不能是虚函数查看全部
-
使用虚析构函数的限制之二:静态成员函数不能是虚函数查看全部
-
使用虚析构的限制之一:普通函数不能是虚函数查看全部
-
1.多态引进的问题:内存泄露 2.(1)当“delete”后面跟着的是父类的指针,那么只会运行父类的析构函数 (2)当“delete”后面跟着的是子类的指针,那么只会运行子类的析构函数,再运行父类的析构函数。 由于以上两点,在执行父类析构函数中释放内存的时候,由于没有运行到子类析构函数,而造成内存泄露。 解决办法:在父类的析构函数中使用虚析构函数。 3.虚函数的使用环境: 1、普通函数不能是虚函数,必须是某个类的成员函数,不能修饰全局函数; 2、静态成员函数不能是虚函数; 3、内联函数不能是虚函数, 4、构造函数不能是虚函数。查看全部
-
【转】先说个函数指针的概念,每个类(除了空类,就是没有方法也没有属性的类)在创建的时候,就会生成一个虚函数表指针,这个指针与普通的指针一样,存的是函数的入口地址,这是在类生成的时候就建立的。下来说几种情况: 父类实现了非virtual修饰的方法一,子类继承父类,子类没有再实现方法一,这样父类与子类的关于方法一在各自虚函数表中的地址是一样的,也就是子类可以直接用父类的方法,而不用再去实现; 父类实现了非virtual修饰的方法一,子类继承父类,子类重写了方法一,这样子类的虚函数表的方法一的地址与父类的虚函数表的方法一的地址是不同的。这时候父类指针指向子类对象的时候,调用方法一时会用父类虚函数表中方法一的入口,这样执行的就是父类方法一的实现;而子类调用方法一时,使用的是子类虚函数表中的方法一的入口,这样执行的就是子类方法一的实现。这种情况叫隐藏。 父类实现了virtual修饰的方法一,子类继承父类,子类没有再实现方法一,这样父类与子类的关于方法一在各自虚函数表中的地址是一样的,也就是子类可以直接用父类的方法,也不用再去实现; 父类实现了virtual修饰的方法一,子类继承父类,子类重写了方法一,这样子类的虚函数表的方法一的地址与父类的虚函数表中方法一的入口地址也是不同的。与第二种情况不同的是,采用virtual修饰的方法,在父类指针指向子类对象时,子类的同名方法会覆盖父类的方法的入口,也就是父类的虚函数表方法一的入口地址会被子类的虚函数表的方法一的入口覆盖,这时候父类指针执行的就是子类的方法一的实现,从而实现多态。这种情况叫覆盖。查看全部
-
静态多态示例查看全部
举报
0/150
提交
取消