-
定义一个父类shape,如果其中有虚函数,那么每次实例化对象的时候,都会产生一个虚函数表指针,这个指针指向的是虚函数表的首地址,再经过偏移等操作会找到相应的虚函数指针,该指针指向的是虚函数的入口地址,从而可以调用虚函数查看全部
-
函数指针指向的是函数的开头抵制,函数的代码就是存储在内存中的二进制代码。查看全部
-
虚函数特性可以被继承,当子类中定义的函数与父类中虚函数的声明相同时,该函数也是虚函数。 虚函数使用virtual关键字定义,但使用virtual关键字时,并非全部是虚函数 虚析构函数是为了避免使用父类指针释放子类对象时造成内存泄露。查看全部
-
构造函数,普通函数(不是在类里面定义的)不能用virtual修饰。virtual修饰析构函数的时候,最后销毁时先执行子类的析构函数,再执行父类的析构函数。否则只是执行父类的析构函数。查看全部
-
当类中没有虚函数的时候: 我们通过类的对象访问其数据成员,访问其成员函数;前面已经知道,实例化对象时,只有数据成员的大小,这说明类的成员函数是统一放在内存代码区的,并且有自己的类名称空间作为限制,只能自己实例化的对象访问;所以我们通过对象访问数据成员,是直接在对象的内存块中偏移得到;而通过对象访问成员函数,则是要到代码区才能访问到; 当父类与子类之间有重名函数时: (1)通过子类对象访问父类该重名函数(于是有了隐藏): 父类与子类有重名函数时,这时出现了隐藏,即子类是继承了父类的该重名函数的,但是将其隐藏了。通过子类对象访问该函数时,访问的是子类自己的该函数,如果想要访问父类的该函数,则要在函数前面加上父类的名称空间限定;代码示例如下:父类Person和子类Worker,都有一个同名函数name();通过子类对象worker调用父类该函数时,worker.Person::name(); (2)通过父类指针指向子类对象,并访问子类重名函数(于是有了虚函数): 父类指针指向子类对象时,父类指针只能访问子类对象的数据成员(部分,继承自父类的),和访问父类在代码区的自己的成员函数;此时,如果想要通过父类指针访问到子类对象的成员函数(即通过父类指针调用子类的析构函数或者普通重名函数),就要将该重名函数设定为虚函数,然后将虚函数地址放进该类的虚函数表中(于是有了覆盖,即在子类虚函数表中用子类虚函数地址覆盖掉父类虚函数地址),而对象又多了个数据成员(虚函数表指针),且在对象内存块首位;这样当我们用父类指针指向子类对象,且调用子类重名虚函数时,就要先在虚函数表中查找,如果找到,就执行;即调用成员函数时,有虚函数表先在虚函数表中查找,然后再在代码区查找; 这里我只解释了父类指针访问子类重名函数的情况,没有解释虚析构函数不重名也能访问的情况。我想可能是析构函数有自己特殊的用法吧,可能每个类的析构函数都是同一个名字,而在代码中名字是不同的吧。这里如果有同学想明白了,希望能不吝赐教;查看全部
-
虚函数使用virtual关键词定义,但并非所有virtual都是虚函数查看全部
-
宏定义避免重复定义类查看全部
-
抛出异常时,抛出的是详细的异常,捕获异常就是,都捕获进来。查看全部
-
用多态继承。用基类去捕获异常。用派生类区处理异常。查看全部
-
多态和异常处理有着紧密的联系查看全部
-
C++中常见的异常,数组越界:提示用户就好了。除数为零,也比较常见。系统处理就会有错误的结果。内存不足:已经少见了。(循环。吃掉内存)查看全部
-
从这可以看throw的用法。查看全部
-
try catch一对多关系。()里是表示捕获什么样的异常异常捕获。根据不同的异常进行相应的处理。最后用(...)都底。程序员要是偷懒就写最后一个,用户体验不好,容易蒙逼。查看全部
-
异常处理示例查看全部
-
异常处理流程。查看全部
举报
0/150
提交
取消