首页 > 编程知识 正文

c 虚函数的使用方法(c 继承 基类 派生类 虚函数)

时间:2023-05-04 20:07:29 阅读:123976 作者:260

继承类和类的关系包括组合、继承和代理。 继承的本质是代码的复用。 子类从父类继承一些东西,父类也称为基类,子类也称为派生类。 派生类继承了基类除构造函数外的所有成员。

继承方式的继承方式有公共继承(public )、私有(private )和保护性(protected )保护继承。 基类的不同访问修饰符下(公共、保护、私有)的成员由继承方法继承,派生类中的访问限制也有以下不同:

基类的布局为派生类# includeiostreamclassbase { public : base (inta ) :ma(a ) { }public: int ma; (; class derive 3360 public base { public : derive (intb ) :mb(b ),base (b ) ) { }public: int mb; (; int main () Derive ); 返回0; }可以在开发人员命令提示符窗口中访问当前源文件的目录。 使用clconsoleapplication5. CPP/D1 reportsingleclasslayoutderive检查派生类derive的布局时,会出现以下情况:

从图中可以看出,基类布局的优先级高于派生类。 派生对象的工作原理如何?

1 .调用基类的构造函数

2 .调用派生类的构造函数

可以考虑派生类的结构:

1 .调用派生类的析构函数

2 .调用基类析构函数

虚函数执行以下操作:

classbase{public:base(inta ) :ma(a ) {} virtual void Show ) ) STD : cout ' base : show ma=' mastd (; class derive 3360 public base { public : derive (intb ) :mb(b ),base (b ) { } void Show ) ) STD 33603: cout ' (; int main () STD:cout'sizeof(base ) : ' sizeof (base ) std:endl; STD:cout'sizeof(derive ) : ) sizeof (derive ) std:endl; base * Pb=新驱动(20; STD:couttypeid(Pb ).name ) std:endl; STD:3360couttypeid(*Pb ).name ) std:endl; pb-Show (; 返回0; }运行结果如下。

上面的结果表明指向基类的指针指向派生类对象。 如果基类包含虚函数,则基类布局中存在指向虚函数表的虚函数指针,并且派生类中同名同参的函数不需要virtual也是虚函数。 基类和派生类的布局如下。

vfptr的指针大小为4(32位计算机)。 因此,基类的字节数为8,派生类为12。 vfptr指针指向的VF表(虚函数表)中,Base_meta中存储有RTTI信息(运行时类型信息),即class Base,0表示偏移,Base:Show表示偏移typeid ) )可以动态获取类型。

main函数生成派生类对象。 由于pb是指针类型,其类型只与定义点有关,因此打印的pb类型为class Base类型,而pb是自定义类型,动态获取类型时,首先通过求解指针pb的引用找到派生类对象,然后返回VFP Derive_meta中存储了派生类的RTTI信息,其中存储了class Derive,因此*pb的类型为class Derive。

pb指针调用Show ) )函数时,会发生动态多态性。 首先从指针指向的对象中找到vfptr,然后找到vftable取得Show函数的入口地址。 此时,Derive:Show中存储了派生类中的虚函数的入口地址,因此调用派生类中的Show ()函数。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。