这篇文章主要介绍了C/C中虚基类的详解及其作用介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
目录
概述多重继承的问题虚基类初始化例子总结
概述
虚基类(虚拟基类)是用关键字虚拟的声明继承的父类。
多重继承的问题
普通类:
普通类
公共:
int a;
空的显示(){
cout ' A:A=' A endl;
}
};
A类:
A类:公共N {
公共:
int a1
};
B类:
B类:公共N {
公共:
int a2
};
C类:
C类:公共A、公共B{
公共:
int a3
void display(){ cout ' a3=' a3 endl;};
};
主要:
int main() {
C c1
//合法访问
c1 .a:a=3;
c1 .a:display();
返回0;
}
输出结果:
A:a=3
存在的问题:
答:答和乙:甲是普通类成员的拷贝
答:答和乙:甲占用不同的空间
虚基类
我们希望继承间接共同基类时只保留一份成员,所以虚基类就诞生了。当基类通过多条派生路径被一个派生类继承时,该派生类只继承该基类一次。
语法:
班级派生类名:虚拟继承方式基类名
初始化
通过构造函数的初始化表对虚拟类进行初始化。例如:
普通类:
普通类
公共:
int n;
n(int n):n(n){ };
};
A类:
A类:虚拟公共N {
公共:
a(int N):N(N){ };
};
B类:
B类:虚拟公共N {
公共:
b(int N):N(N){ };
};
C类:
C类:公共A、公共B{
公共:
C(int n) : N(n),A(n),B(N){ };
};
例子
人类:
#ifndef PROJECT5_PERSON_H
#定义项目5 _人_小时
#包括输入输出流
#包含字符串
使用命名空间标准
类别人员{
受保护:
字符串名称;
茶性别;
公共:
人员(字符串n,字符g):姓名(n),性别(g) {}
空的显示(){
cout ' name:' name endl;
cout ' gender:' gender endl;
}
};
#endif //PROJECT5_PERSON_H
学生类:
#ifndef PROJECT5_STUDENT_H
#定义项目5 _学生_H
#包含字符串
#包含" Person.h "
使用命名空间标准
学生:虚拟公众人物{
受保护:
双倍积分;
公共:
学生(字符串n,字符g,双s):人(n,g),分数(s){ };
};
#endif //PROJECT5_STUDENT_H
教师类:
#ifndef PROJECT5_TEACHER_H
#定义项目5 _教师_H
#包含字符串
#包含" Person.h "
使用命名空间标准
班主任:虚拟公众人物{
受保护:
字符串标题;
公共:
教师(字符串n,字符g,字符串t):人(n,g),头衔(t){ };
};
#endif //PROJECT5_TEACHER_H
毕业类:
#ifndef PROJECT5_GRADUATE_H
#定义项目5 _毕业生_H
#包含"老师. h "
#包含"学生. h "
#包含字符串
使用命名空间标准
毕业班级:公立教师,公立学生{
私人:
双倍工资;
公共:
毕业生(字符串n,字符g,双s,字符串t,双w):人(n,g),学生(名词,名词,名词),老师(n,g,t),工资(w){ };
空的显示(){
person:display();
cout ' score:' score endl;
' cout ' title:' title endl;
cout ' wages:' wage endl;
};
};
#endif //PROJECT5_GRADUATE_H
主要:
#包括输入输出流
#包含" Graduate.h "
使用命名空间标准
int main() {
毕业生梯度1('小白,' f ',89.5 '教授',1234.5);
一年级。显示();
返回0;
}
输出结果:
名称:小白
性别:女
得分:89.5
标题:教授
工资:1234.5英镑
总结
使用多重继承时要十分小心,否则会进场出现二义性问题
不提倡在程序中使用多重继承
只有在比较简单和不易出现二义性的情况或实在必要时才使用多重继承
能用单一继承解决的问题就不要使用多重继承
到此这篇关于C/C中虚基类详解及其作用介绍的文章就介绍到这了,更多相关C虚基类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。