C++的继承方式
来源:互联网 发布:c语言实型数据 编辑:程序博客网 时间:2024/04/27 05:47
C++支持多种程序设计风格,其中就包括对面向对象设计的支持。我们今天在这里将会为大家详细介绍一下各种C++继承方式的具体应用方法,希望能够帮助大家对这方面的知识有一个深入的认识。
C++继承方式总共分为以下几种:
public、private、protected三种(它们直接影响到派生类的成员、及其对象对基类成员访问的规则)。
(1)public(公有继承):继承时保持基类中各成员属性不变,并且基类中private成员被隐藏。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象只能访问基类中的public成员。
(2)private(私有继承):继承时基类中各成员属性均变为private,并且基类中private成员被隐藏。派生类的成员也只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
(3)protected(保护性继承):继承时基类中private成员被隐藏,基类其他中各成员属性均变为protected。派生类的成员只能访问基类中的public/protected成员,而不能访问private成员;派生类的对象不能访问基类中的任何的成员。
既然说到继承方式,那应该说下虚继承,即虚基类
在一个复杂的系统中,类的继承中不免会出现多重继承的方式,比较常见的就如下面的菱形继承
B
/ \
D1 D 2
\ /
A
当某个类的部分或者全部直接基类是从另一个共同基类派生而来时,在这些直接基类中会拥有从上一级的共同基类继承过来的相同名称的成员,在派生类中,这些相同成员拥有多个拷贝,而且同一个函数名会有多个映射,我们可以在使用继承类时通过作用域“::”分辨符来唯一标识并访问他们,但是这样使用既造成内存浪费,使用起来也比较麻烦容易弄错。因此,虚基类出场了。
将共同基类设置为虚基类,从不同路径继承过来的同名数据成员在内存中只有一份拷贝,并且同一个函数名只有一个映射,在使用时直接调用即可。
虚基类的声明是在派生类的定义过程中进行的
class 派生类名:virtual 继承方式 基类名A --------这样A就变成了虚基类了
虚基类和派生类的构造函数
如果虚基类的构造函数式默认的,则其派生类不需要对其初始化,如果虚基类的构造函数非默认的,即有参数,而且没有声明默认形式下的构造函数,那么在整个的继承关系中,直接或者间接继承虚基类的所有派生类,都必须在构造函数的成员初始化列表中列出对虚基类的初始化。
下面是代码
#include <iostream>using namespace std;class Base{public:Base(int i_v){m_v = i_v;}void Show() {cout<<m_v<<endl;}public:int m_v;};class Devid1:virtual public Base{public:Devid1(int i_v): Base(i_v){}};class Devid2:virtual public Base{public:Devid2(int i_v): Base(i_v){}};class A:public Devid1, public Devid2{public:A(int i_v): Base(i_v), Devid1(i_v), Devid2(i_v){}};void main(){A *a = new A(3);a->Show();a->m_v = 6;a->Show();delete a;system("pause");}
A类继承了两次的Base类的成员,但是调用没有冲突,这就是因为虚继承的作用。
运行结果如下
- C++-继承的概念与方式
- C++(继承语法&&继承方式)
- 类的继承方式
- javascript的继承方式
- 类的继承方式
- JS的继承方式
- C++的继承方式
- JS的继承方式
- 类的继承方式
- C++的继承方式
- 44、继承的方式
- 继承的实现方式
- 单继承的方式
- JavaScript继承的方式
- C/C++继承方式--形象化表述
- C++/3种继承方式测试
- C++——三种继承方式
- public、protect、private继承方式 C++(转)
- 软件定义无线电 (SDR) 和业余试验
- 威盛/网易笔试准备
- linux中的字符设备与块设备
- 企业 一
- 自动消失对话框
- C++的继承方式
- 通过Jar手动把war打包后,tomcat无法访问war包
- linux下解决:cannot execute binary file
- surface pro下android虚拟机无法启动的解决方案
- 仿百度文库方案[openoffice.org 3+swftools+flexpaper](一) 之 tomcat6.0+jdk1.6环境配置
- Lucene.Net 2.3.1开发介绍 —— 二、分词(一)
- 单例模式
- 深入浅出的理解框架(Struts2、Hibernate、Spring)与 MVC 设计模式
- ios 固件更新四种常用方法