C++ 02

您所在的位置:网站首页 SMTP发信活动 C++ 02

C++ 02

2022-11-09 04:22| 来源: 网络整理| 查看: 265

 虚函数:由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为“虚”函数。  虚函数的核心作用: 实现动态联编,在函数运行阶段动态的选择合适的成员函数。 在定义了虚函数后,可实现在派生类中对虚函数进行重写,从而实现统一的接口和不同的执行过程。

总结: 1.在使用继承的方式实现运行时多态时,基类需要将与派生类相同函数名的函数加上virtual关键字,这样才可以在运行时精准识别出子类的虚函数。 2,如果没有继承关系但是需要多态的效果则需要将两个不同类的同名函数都加上virtual关键字;同时,需要将定义的指针指向其他对象时,要进行强制类型转换。   ptr = (A*)&btr; 3.带有多态性质的基类均应该声明一个virtual析构函数。同时如果任一class带有任何virtual函数,它就应该拥有一个virtual析构函数。 4.当class的设计目的如果不是作为base class使用,或不是为了具备多态性,则就不该声明virtual析构函数。(因为如果class中含有virutal函数会使得该class的体积增加,因为添加一个vptr(virtual table pointer)会增加其class大小达50%-100%)

 联编?  程序调用函数,编译器决定使用哪个可执行代码块。(所谓联编就是将函数名和函数体的程序连接到一起的过程)  静态联编 :在编译的时候就确定了函数的地址,然后call就调用了。(函数重载、函数模板的实例化)  动态联编 :首先需要取到对象的首地址,然后再解引用取到虚函数表的首地址后,再加上偏移量才能找到要调的虚函数,然后call调用。

问题: 1,为什么调用普通函数比调用虚函数的效率高? * 因为普通函数是静态联编的,而虚函数是动态联编的 2,为什么要用虚函数表(存函数指针的数组)? 同一个类的多个对象的虚函数表是同一个,所以这样就可以节省空间,一个类自己的虚函数和继承的虚函数还有重写父类的虚函数都会存在自己的虚函数表。同时,虚函数表本质是一个地图导航,可以清楚告诉一个想要操作子类的父类指针到底该使用哪个函数。 3,为什么要把基类的析构函数定义为虚函数? 编译器对析构函数做了特殊的处理,在内部子类和父类的析构函数名是一致的 在用基类操作派生类时,为了防止执行基类的析构函数,不执行派生类的析构函数。因为这样的删除只能够删除基类对象, 而不能删除子类对象,会造成内存泄漏.

需要注意的是:

1. 虚函数不能是静态成员函数,或友元函数,因为它们不属于某个对象。

2. 内联函数不能在运行中动态确定其位置,即使虚函数在类的内部定义,编译时,仍将看作非内联。

3. 构造函数不能是虚函数,析构函数可以是虚函数,而且通常声明为虚函数。

// 继承关系中的虚函数: #include using namespace std; class A { public: A() {}; ~A() {}; virtual void show(void) { cout 派生类

析构函数调用顺序:派生类->基类

// const 修饰的成员必须进行初始化在构造方法里 // 而static const修饰的成员需要在类外进行初始化 #include using namespace std; class A { private: const int age; int const m; static const int x; public: A(int age, int m) :age(age), m(m) { cout     //异常处理代码 } catch(异常类型2) {     //异常处理代码 } catch(异常类型3) {     //异常处理代码 } //后续代码

#include #include #include #include #include using namespace std; int main() { int a, b; cin >> a >> b; try { if (b == 0) { throw "error"; } } catch (const char* str) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3