23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数
2021-06-23 12:06
标签:定义 ring 编译器 多态 同名成员函数 width tar 变量 delete 在C++中,继承方式共有3种: public继承 -指父类的成员(变量和函数)访问级别,在子类中保持不变 private继承 -指父类的成员,在子类中变为private私有成员. -也就是说子类无法访问父类的所有成员 protected继承 -指父类的public成员 ,在子类中变为protected保护成员,其它成员级别保持不变
注意: protected继承只针对子类有效 比如当父类是protected继承时,则子类的子类就无法访问父类的所有成员 一般而言,C++项目只用到public继承 显示调用父类构造函数 比如以下代码: 编译运行: 来显示调用 接下来,修改上面子类的StrB(string s)函数,通过初始化列表调用StrA(string s)父类构造函数material可数吗 改为: 运行打印: 父子间的同名成员和同名函数 比如: 在main()函数执行: 打印: 从打印结果看到,父类和子类之间的作用域是不同的, 所以执行父类的同名成员变量和函数需要作用域分辨符(::)才行 父子间的兼容 以上示例的Parent父类Child子类为例 其实是编译器是将子类对象退化为了父类对象, 从而能通过子类来赋值初始化父类 所以上述的父类对象(包括指针/引用)也只能访问父类中定义的成员. 如果父类对象想访问子类的成员,只能通过强制转换,将父类对象转为子类类型 示例1,通过C方式转换: 示例2,通过static_cast转换: 首先参考下面,没有虚函数的示例: 运行打印: 从结果看出,即使example函数的指针p指向了Child c,也只能调用父类的example(),无法实现多态性. 所以C++引入了虚函数概念,根据指针指向的对象类型,来执行不同类的同名覆盖成员函数,实现不同的形态 定义: 在父类成员函数的返回值前面,通过virtual关键字声明,这样便能访问子类中的同名成员函数了 接下来将上个示例的父类成员函数example()改写为虚函数: 运行打印: 可以发现,父类和子类的长度都增加了4字节,这4个字节就是用来指向“虚函数表”的指针,编译器便会更据这个指针来执行不同类的虚函数,实现多态性. 虚析构函数 -在使用基类指针指向派生类对象时用到 -通过基类析构函数可以删除派生类对象 示例 运行打印: 可以发现,由于基类的析构函数是虚函数,所以我们delete基类指针时,派生类也跟着调用了析构函数,从而避免了内存泄漏,也能满足使用dynamic_cast强制转换了 一般而言,虚构造函数只有在继承下才会被使用,单个类是不会使用虚构函数的,因为虚函数表会产生额外的空间 注意:构造函数不能成为虚函数,因为虚函数表是在构造函数执行后才会进行初始化 文章来源:https://www.cnblogs.com/lifexy/p/8698293.html 23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数 标签:定义 ring 编译器 多态 同名成员函数 width tar 变量 delete 原文地址:https://www.cnblogs.com/xiongjim/p/9673955.html
文章标题:23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数
文章链接:http://soscw.com/index.php/essay/97785.html