您的位置:首页 > 财经 > 产业 > 项目名称有创意大全_长春建站费用_惠州seo外包服务_下载百度到桌面

项目名称有创意大全_长春建站费用_惠州seo外包服务_下载百度到桌面

2024/12/23 3:28:16 来源:https://blog.csdn.net/2302_79031646/article/details/144007801  浏览:    关键词:项目名称有创意大全_长春建站费用_惠州seo外包服务_下载百度到桌面
项目名称有创意大全_长春建站费用_惠州seo外包服务_下载百度到桌面

继承和多态一直是CPP语法的一个难点, 下面我针对我了解到的一些细节点题目做一个简单汇总, 下面全是语法题, 帮助更好的掌握语法:

目录

    • T1 什么是虚函数?
    • T2 静态成员函数 可以是 虚函数吗?
    • T3 析构函数 可以是 虚函数 吗?
    • T4 构造函数可以是虚函数吗?
    • T5 虚函数表存储在哪里?
    • T6 多态性 与 多态的概念区分
    • T7 动态绑定机制?
    • T8 多态匹配?
    • T9 权限 与 重写
    • T10 在构造函数里不具有多态性

T1 什么是虚函数?

虚函数 = virtual + 类成员函数

请注意, 这个地方必须是类成员函数才行, 这个类成员函数只要函数声明在类中即可, 不一定要定义在类内. 全局函数前面 + virtual 是直接报错的.

T2 静态成员函数 可以是 虚函数吗?

不可以! 静态成员函数是没有this指针的, 因为没有this指针, 因此说是不能通过this指针访问类对象的虚函数表中去调用虚函数的.

T3 析构函数 可以是 虚函数 吗?

可以. 只不过一般建议在多态场景下使用, 因为非多态情况下会降低效率. 因为要去虚函数表中去间接访问, 构成虚函数表也是一个额外开销…

T4 构造函数可以是虚函数吗?

不可以. 因为虚函数表是在构造函数之后才生成的. 因此说必须得保证构造函数不是虚函数才能正常调用, 如果构造函数都是虚函数了, 怎么找到构造函数生成虚函数表呢?

T5 虚函数表存储在哪里?

虚函数表是在编译期间生成的, 放在常量区中. 不过虚函数表里面的内容(虚函数的地址)是在运行期间确定的.

T6 多态性 与 多态的概念区分

多态性并不是特指某个语言里的语法, 而是一种广义上的概念, 即允许对象通过同一个同一个接口表现出不同的行为, 这样一个概念.

比如说CPP当中的函数重载算是一种多态性. CPP中的模板也算是一种多态性, 再比如CPP中的多态调用更是一种多态性.

T7 动态绑定机制?

这玩意是说的是CPP中多态语法实现的一种底层原理的. CPP中多态实现逻辑是通过动态绑定机制实现的, 说白了就是虚函数表里面的内容不是编译时确定的, 而是运行时, 通过具体的对象来确定的虚函数表里面虚函数的地址的.

他还有个名字叫做晚期绑定, 是相对于编译绑定(早期绑定)来说的.

T8 多态匹配?

在这里插入图片描述

T9 权限 与 重写

在这里插入图片描述
在这里插入图片描述

这个代码我感觉本身就有问题, 看编译器吧具体来说. 如果编译器能够发现这个"权限"问题可能会中止掉这种代码, 如果发现不了, 就会出意想不到的结果.
在VS当中, VS并没有发现上面的权限问题, 还是照常调用的.

下面是AI的解释:
您的理解部分正确,但也有一些需要澄清的地方。在C++中,当子类继承父类并重写父类中的虚函数时,确实会涉及到虚函数表(vtable)的更新。不过,关于权限和访问控制,有一些细节需要注意。

虚函数表(vtable):
每个包含虚函数的类都会有一个虚函数表,该表存储了类中所有虚函数的地址。
当子类继承父类时,子类会继承父类的虚函数表结构,并在自己的虚函数表中为继承来的虚函数(以及可能的新增虚函数)保留位置。
如果子类重写了父类中的某个虚函数,那么子类虚函数表中对应的位置会被更新为子类重写版本的函数地址。
访问控制:
虚函数的访问控制是基于其声明所在的类的。即,如果虚函数在父类中被声明为public,那么在父类及其派生类中(通过基类指针或引用)都可以访问它(当然,要遵守C++的访问控制规则)。
如果子类将继承来的虚函数重写为private,那么这个重写版本只能在子类内部或通过友元关系访问。然而,从基类指针或引用的角度来看,它们仍然“看到”的是父类中的public虚函数声明(尽管实际调用会解析到子类的重写版本,如果对象实际上是子类的实例)。
关于调用:
当您通过基类指针调用虚函数时,如果对象实际上是子类的实例,并且子类重写了该虚函数,那么调用将解析到子类的重写版本。
但是,如果子类的重写版本是私有的,并且您试图从基类指针的外部访问它,那么这通常会导致编译错误,因为您正在尝试访问一个不可见的私有成员。
在某些情况下,如果编译器没有捕捉到这种非法访问(可能是由于编译器的特定行为或优化),您可能会看到意外的行为或结果。然而,这并不意味着这种行为是合法的或可移植的。
您的代码:
在您的代码中,B::f()被声明为私有,但您仍然能够通过A*类型的指针调用它,并且看到了B::f()的输出。这很可能是编译器的特定行为导致的,而不是C++标准所保证的行为。
正确的做法是避免这种情况,不要试图通过基类指针访问派生类的私有成员。
综上所述,虽然子类中的虚函数表确实是从父类那里继承过来的,并且子类可以重写父类中的虚函数,但访问控制仍然是基于虚函数声明的原始类来确定的。在您的例子中,看到B::f()的输出可能是由于编译器的特定行为,但这并不意味着这种行为是合法的或可移植的。因此,建议遵循C++的访问控制规则,以避免潜在的问题和未定义行为。

T10 在构造函数里不具有多态性

在这里插入图片描述
在这里插入图片描述

上面就分享这么多, ~~~


EOF

版权声明:

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

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