C++ (P160—)多继承 二义性 虚基类 “向上转型”
1 多继承中,必须给每个基类指定一种派生类型,如果缺省,相应的基类则取私有派生类型,而不是和前一个基类取相同的派生类型
2 一个类的保护成员只能被本类的成员函数或者它的派生类成员函数访问
3 由于c++中不允许对类成员进行初始化,但是在编程时需要用特定的值去初始化派生类的对象,这时需要通过为派生类定义一个带有初始化列表的构造函数来实现。
class D:public B,private A,public C
{
public:
D(){..................}
D(int a,int b,int c,int d,int e,int f,int g):A(a,b),a(d,e),b(f),B(c),w(g)
{..................}
..........
private:
C c;
A a;
B b;//只能这样进行定义类成员变量
int w;
}; int main ()
{
D d1;
D d2(,,,,,,);
return ;
}
4 多继承造成的二义性:若派生类中的成员函数与其基类成员重名的现象,派生类中的成员函数将覆盖所有基类中的同名成员。但是如果只是基类与基类之间的成员重名,
需要使用作用域运算符“::”来限定:
d.A::a=;
d.B::fun();
注意两点:a. 需要采用派生类的直接基类名来限定,而不是需要访问的成员所在类的类名。
b. 二义性是在访问控制权限和类型检查之前进行的,因此制定不同的访问控制权限和类型并不能解决二义性问题。
5 在多继承中的虚基类的作用:以虚基类的形式继承,只建立公共基类的一个副本,这样就不存在二义性
注意点:c++规定,对于继承过程中的虚基类,它们由最后派生出来的用于声明对象的类来初始化,而对于派生类的基类中对这个虚基类的初始化都被忽略。
class 派生类名:virtual 派生类型 基类名
6 “向上转型”
区别于java,c++有三种情况的向上赋值
(1)用派生类的对象给积累的对象赋值,赋值的结果是将派生类对象中的所含积累成员的值赋给基类对象中相同的成员
(2)可以用派生类的对象初始化基类的引用
(3)可以用派生类对象的地址给积累对象的指针赋值。
23中方法中的基类的引用和指针只能用来访问派生类对象中从基类继承下来的成员,若想访问派生类中新增成员需要进行强制转换。
#include <iostream>
#include <string> using namespace std;
class A
{
public:
void funa(){cout<<"调用的A"<<a<<endl;}
int a;
};
class C:public A
{
public:
void func(){cout<<"调用的C"<<c<<endl;}
int c;
}; int main()
{ C c;
c.a=;
c.c=;
A &a = c;
A *aa = &c;
A aaa = c;
a.funa();
((C&)a).func();
((C*)aa)->func();
((C)aaa).func();//error
aaa.func();//error
return ;
}
C++ (P160—)多继承 二义性 虚基类 “向上转型”的更多相关文章
- C++ 类的继承六(多继承的二义性--虚基类)
//多继承的二义性--虚基类(了解为主) #include<iostream> using namespace std; /* 多继承在现在的项目开发中一般不使用,他会增加项目的复杂度 * ...
- YTU 2622: B 虚拟继承(虚基类)-沙发床(改错题)
2622: B 虚拟继承(虚基类)-沙发床(改错题) 时间限制: 1 Sec 内存限制: 128 MB 提交: 487 解决: 393 题目描述 有一种特殊的床,既能当床(Bed)用又能当沙发(S ...
- C++ 多继承与虚基类
转载来自:CSDN insistGoGo (http://blog.csdn.net/insistgogo) 多继承的定义:派生类的基类大于一个 语法: class 派生类名:继承方式1 基类名1 ...
- 【C++】继承(虚基类)
类的继承与派生 面向对象技术强调软件的可重用性,这种重用性通过继承机制来实现.而在类的继承过程中,被重用的原有类称为基类,新创建的类称为派生类.派生类定义语法格式如下: class <派生类名& ...
- 【M24】了解虚方法、多继承、虚基类、RTTI的成本
1.编译器必须实现出C++语言的特性.一般情况下,我们只需要使用这些特性就好了,不需要关心内部的实现细节.但是,有些特性的实现,会对对象的大小和成员方法的执行速度造成影响.因此,有必要了解内部实现的细 ...
- C/C++ 多继承{虚基类,虚继承,构造顺序,析构顺序}
C/C++:一个基类继承和多个基类继承的区别 1.对多个基类继承会出现类之间嵌套时出现的同名问题,如果同名变量或者函数出现不在同一层次,则底层派生隐藏外层比如继承基类的同名变量和函数,不会出现二义性, ...
- C++ 虚继承实现原理(虚基类表指针与虚基类表)
虚继承和虚函数是完全无相关的两个概念. 虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝.这将存在两个问题:其一,浪费存储空间:第二,存在二义性问题,通常可 ...
- C++虚基类详解(转)
我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避 ...
- c++ 虚基类应用
多重继承存在二义性,为了消除二义性在访问相同名称的属性时需要加上类名,加以区分.虽然这样可以解决二义性,但是相同的属性出现在多个基类中,为了解决数据冗余,c++引入了虚基类. 虚基类定义:class ...
随机推荐
- Live555研究之三 RTSP Server处理请求
RTSP Server会不断用select查询是否有socket连接,如果有则在(*handler->handlerProc)(handler->clientData, resultCon ...
- 4种activity的启动模式
在android里,有4种activity的启动模式,分别为: “standard” (默认) “singleTop” “singleTask” “singleInstance” 它们主要有如下不同: ...
- HDU 5699 货物运输 二分判定
转自:http://blog.csdn.net/jtjy568805874/article/details/51480479 #include <cstdio> #include < ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...
- 为什么浏览器User-agent总是有Mozilla字样(User-agent String里的历史故事)【搜藏】
你是否好奇标识浏览器身份的User-Agent,为什么每个浏览器都有Mozilla字样? Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ...
- 词汇小助手V3.0发布了——不只是一个查单词的软件
欢迎使用词汇小助手 作者:IT小小龙 电子邮箱:long_python@126.com 个人博客:http://blog.sina.com.cn/buduanqs 一款跨平台词汇查询记忆学习软件. 已 ...
- [娱乐]GameMaker绘制参数方程的图像
今天,我翻了旧物,硬着头皮看了这源码.突然恍然大悟,这岂不就是当年学的参数方程! 目前,最早开始教授参数方程实在高三时,并作为一门选修课程,简化了求解圆锥曲线方程的难度,在高考中也很容易拿分,考试过后 ...
- ASP.NET服务器控件OnClientClick事件中Eval()作为js方法的参数的一种写法
参考代码: <input type="button" OnClientClick='<%#Eval("DeptID", "DelUserD ...
- codeforce 609A - USB Flash Drives
排序水题 #include<iostream> #include<cstdlib> #include<cstdio> #include<algorithm&g ...
- jquery chart plugin
jquery flot http://www.jqueryflottutorial.com/ jquery jqplot http://www.jqplot.com/ highcharts中文网 : ...