您的位置:首页 > 游戏 > 手游 > 上海策朋网站设计公司_比较好看的网站_新媒体营销策略_138ip查询网域名解析

上海策朋网站设计公司_比较好看的网站_新媒体营销策略_138ip查询网域名解析

2025/3/1 13:23:32 来源:https://blog.csdn.net/2401_86702190/article/details/145911833  浏览:    关键词:上海策朋网站设计公司_比较好看的网站_新媒体营销策略_138ip查询网域名解析
上海策朋网站设计公司_比较好看的网站_新媒体营销策略_138ip查询网域名解析

目录

静态多态

动态多态

虚函数

性质:

类型转换

final和override

纯虚函数

动态多态原理

协变

例题

小知识


静态多态

主要包括函数重载和运算符重载、模版。

静态多态的函数地址早绑定 - 编译阶段确定函数地址

动态多态

动态多态指虚函数、纯虚函数。

动态多态的函数地址晚绑定 - 运行阶段确定函数地址。

实现虚函数的动态多态有两个必要条件:

1.必须是基类的指针或引用调用虚函数。

2.被调用的函数必须是虚函数,并且完成了虚函数的重写(覆盖)。

虚函数

关键字:virtual 

在类的成员函数前加virtual ,就出现一个虚函数。

性质:

1.如果是使用指针或引用调用虚函数,对象的动态类型才可能与静态类型不同,才会进行动态绑定,被调用的函数与绑定到指针或引用的对象的动态类型(也就是真实类型)相匹配。                   例如:基类的指针指向派生类对象时,如果派生类对象含有这个虚函数,则会调用派生类的这个虚函数。

2.一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参列表的类型需与被它覆盖的虚函数相同,函数的返回值类型也必须相匹配(如果返回值类型是类本身的指针或引用,则返回值可以不匹配,因为这里支持可访问的类型转换)。

3.使用父类指针或者引用去销毁子类对象,只会调用父类中的析构函数,并不会调用子类的析构函数。

4.在设计类时,如果这个类会被继承,析构函数最好加virtual,这样可以防止第二条中造成的内存泄漏,对于虚函数的重写需要函数名、返回值、形参列表相匹配的要求,析构函数的名字被同一处理为destructor,符合要求。

5.一旦某个函数被声明为虚函数,则在所有派生类中都会是虚函数,所以对于基类中已声明为虚函数的派生类中的虚函数,可加virtual可不加。

回避虚函数的机制:可以使用作用域限定符来强制执行。

注:如果在一个派生类虚函数调用它的基类版本,但没有使用作用域限定符,则在运行时该调用将会被解析为对派生类自身版本的调用,无限递归。

类型转换

对于基类和派生类之间的转换:

1.从基类到派生类只能显式转换,不能隐式类型转换,基类的指针或引用可以通过强制类型转换赋值给派生类的指针或引用,但是必须要基类的指针指向派生类对象才安全。

2.赋值兼容转换: 从派生类到基类的引用的转换中并没有产生临时对象(具有常性),而是直接转换

3.如果用基类指针接收派生类的对象的地址,则这个指针只能访问该派生类对象的基类成员;所以如果给基类的拷贝构造等函数传派生类对象时,只会将派生类中的基类部分拷贝、操作,会忽略掉其他部分。

final和override

override 用来标记派生类中的虚函数,如果标记后没有覆盖掉基类中对应的虚函数,那么编译器会报错。(只有虚函数才能被覆盖后有多态性,普通相同函数发生覆盖是无多态性的,不能动态绑定)

final 用来防止继承和覆盖。在定义final之后的继承和覆盖操作会被阻止。(可修饰虚函数或者一个类)

要实现一个不能被继承的类,除了final还可以将基类的构造函数私有,因为派生类的构造必须调用基类的构造函数,但是基类的构造函数私有化,派生类不可用,那么派生类就无法实例化出对象了。

纯虚函数

给虚函数的函数体后书写 = 0,将一个虚函数声明为纯虚函数。 含有(或者未经覆盖直接继承)纯虚函数的类叫抽象基类。 如果抽象基类的派生类中未给纯虚函数重写(重新定义),则该类依旧会成为抽象基类。

抽象基类不能(直接)创造对象。

动态多态原理

一个类有虚函数,就会有虚函数表,这个类的对象就会有虚表指针(占指针大小的空间)。

虚函数表:储存了该类所有虚函数的地址,储存在数据段。

虚表指针:指向该类的虚函数表的指针,该类的所有对象的虚表指针都指向同一个虚函数表。

基类中有虚表指针,派生类会继承基类的虚表指针,不会再生成新的虚表指针,但派生类的虚表指针指向的是派生类自己的虚函数表,当完成虚函数的重写时,派生类的虚表指针指向的原来基类虚函数的地址会被覆盖为重写的虚函数的地址。

综上所述,在运行时,基类的指针或引用是到指向的对象的虚表中找对应的虚函数的地址,进行调用。

协变

虚函数的返回值类型如果是自身对象的指针或引用,虽然不同,但是因为可以自动进行隐式类型转换,所以可以成立,这种基类虚函数返回基类对象的指针或引用,派生类虚函数返回派生类的指针或引用的情况叫协变。

例题

class A
{
public:virtual void func(int val = 1){std::cout<<"A->"<<val<<std::endl;}virtual void test(){func();}
};class B:public A
{
public:void func(int val = 0){std::cout<<"B->"<<val<<std::endl;}
};int main(int argc,char* argv[])
{B*p = new B;p->test();return 0;
}

以上程序输出结果是什么()

A:A->0    B:B->1    C:A->1    D:B->0   E:编译错误    F:以上均不正确

答案:B 

解析:在调用派生类中的虚函数时,相当于调用的是基类函数的声明+派生类函数的实现。

小知识

1.10u为无符号整形10

2.assert断言在debug版本下会报错,但在release版本下不会报错。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com