-
使用父类指针指向子类对象时,如果一个集合里又有三角形又有矩形又有圆形,但是每个类里面都有一个单独的计算面积的成员函数,采用虚函数的方式,可以确保找到正确的计算面积的成员函数。 动态多态(晚绑定):例如父类father有个方法名字叫go(){“父类的go”}; 子类son有个方法也叫go(){“son的go”}; 子类daughter有个方法也叫go(){“daughter的go”}; father *p1=new son; father *p2=new daughter; 然后当我们执行 p1->go(); p2->go(); 输出的结果都只是父类的go;如果想实现输出"son的go"和"daughter的go",就需要在父类的go()方法得前面加上关键字virtual变成。这样再输入p1->go();p2->go();就可以输出"son的go"和"daughter的go"查看全部
-
type_info查看全部
-
typeid查看全部
-
dynamic_cast查看全部
-
如果父类中的calcArea为虚函数(其虚函数表为0xCCFF),且子类没有这个函数,则子类的虚函数表(0x6688)中calcArea指向父类的calcArea地址(0x3355);若子类有calcArea,则其虚函数表(0x6688)指向自己的calcArea(0x4B2C)查看全部
-
虚函数表指针指向虚函数表查看全部
-
在写析构函数的时候,最好是在析构函数的前面加上一个virtual的关键字,因为我们不知道在以后继承的时候子类会不会在析构函数中进行销毁指针和释放内存的操作,在父类的析构函数前面加上virtual可以使子类的析构函数被调用,防止内存泄漏查看全部
-
virtual关键字使用的限制: 1.不能使用普通的函数,只能是类的成员函数 2.不能使用于静态成员函数 3.不能使用于构造函数 4.不能适用于内联函数查看全部
-
virtual关键字使用的限制: 1.不能使用普通的函数,只能是类的成员函数 2.不能使用于静态成员函数 3.不能使用于构造函数 4.不能适用于内联函数查看全部
-
动态多态有产生内存泄漏的隐患,此时释放的是父类的内存空间,子类的析构函数并未执行查看全部
-
使用父类指针指向子类对象时,如果一个集合里又有三角形又有矩形又有圆形,但是每个类里面都有一个单独的计算面积的成员函数,采用虚函数的方式,可以确保找到正确的计算面积的成员函数。查看全部
-
/** * 定义函数division * 参数整型dividend、整型divisor */ int division(int dividend, int divisor) { if(0 == divisor) { // 抛出异常,字符串“除数不能为0” throw string("除数不能为0"); } else { return dividend / divisor; } } int main(void) { int d1 = 0; int d2 = 0; int r = 0; cin >> d1; cin >> d2; // 使用try...catch...捕获异常 try{ division(d1,d2); } catch(string str){ cout<<str<<endl; } return 0; }查看全部
-
/** * 定义射击类:CanShut * 定义纯虚函数:aim、reload */ class CanShut { public: virtual void aim()=0; virtual void reload()=0; }; /** * 定义枪类:Gun * 公有继承射击类 * 实现成员函数:aim、reload */ class Gun : public CanShut { public: virtual void aim() { cout << "Gun -- aim" << endl; } virtual void reload() { cout << "Gun -- reload" << endl; } }; /** * 定义含参函数射击:hunting * 调用参数的aim与reload函数 */ void hunting(CanShut*s) { s->aim(); s->reload(); } int main(void) { // 实例化枪对象 CanShut *p=new Gun(); // 调用含参函数hunting,将对象枪传入函数中 hunting(p); // 释放内存 delete p; p=NULL; return 0; }查看全部
-
*/ class Animal { public: // 默认构造函数 Animal(){}; // 含参构造函数 Animal(string name){m_strName = name; cout << "Animal" << endl;} // 虚析构函数 virtual ~Animal(){cout << "~Animal" << endl;} // 虚成员函数 virtual void eat(){cout << "Animal--" << m_strName << "-- eat" << endl;} // 纯虚函数 virtual void move()=0; public: // 数据成员 string m_strName; }; /** * 定义狗类:Dog * 公有继承动物类 * 虚成员函数:eat()、move() */ class Dog : public Animal{ public: // 默认构造函数 Dog(){}; // 含参构造函数 Dog(string name){m_strName = name; cout << "Dog" << endl;} // 虚析构函数 virtual ~Dog(){cout << "~Dog" << endl;} // 虚成员函数eat() virtual void eat(){cout << "Dog--" << m_strName << " -- eat" << endl;} // 虚成员函数move() virtual void move(){cout << "Dog--" << m_strName << " -- move" << endl;} public: // 数据成员 string m_strName; }; int main(void) { // 通过动物类实例化狗类 Animal *p=new Dog("狗类"); // 调用成员函数 p->eat(); p->move(); // 释放内存 delete p; p=NULL; return 0; }查看全部
-
默认Exception类型查看全部
举报
0/150
提交
取消