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 ...
随机推荐
- 序列化类型为XX的对象时检测到循环引用
/// 产品列表展示 /// </summary> /// <returns></returns> ) { //获得所有组别 Galasys_IBLL.IT_BIZ ...
- DbHelper and OracleHelper
1 连接Sql Server的ConnectionString: Data Source=.;Initial Catalog=ViewVideo;User ID=sa;Password=XXXXXX; ...
- 用JDBC访问ORACLE数据库 关于commit 增快效率 大数据 等的整理
1.问:用JDBC访问ORACLE数据库,做DELETE操作,能用JAVA多线程实现吗? ORACLE服务器要怎么配?(以下答案来自网络,仅供参考) 答: Oracle有自己的锁机制.就算你开100条 ...
- C# 网页图片爬虫的几种技术基础
一.文件流方式获取网络图片资源 方法1 , ); System.Net.WebRequest webreq = System.Net.WebRequest.Create(url); System.Ne ...
- java jvm学习笔记三(class文件检验器)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验 ...
- less命令
less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览.用less命令显示文件时,用PageUp键向上翻页,用P ...
- 基于kryonet的RPC,使用kryo进行序列化
Kryo是一个序列化框架. Kryonet是一个基于kryo的RPC框架,它实现了一套高效简洁的API,它通过NIO实现了TCP和UDP通讯,目前还不支持Http. 自己写了一个测试代码,运行了下,感 ...
- Swift之基础知识
Swift之基础知识 出于对Swift3.0的学习,写下这篇基本语法的笔记.希望能帮助记忆 -0- 这边提供Swift3.0中文教材,资源链接: https://pan.baidu.com/s/1c2 ...
- 利用过采样技术提高ADC测量微弱信号时的分辨率
1. 引言 随着科学技术的发展,人们对宏观和微观世界逐步了解,越来越多领域(物理学.化学.天文学.军事雷达.地震学.生物医学等)的微弱信号需要被检测,例如:弱磁.弱光.微震动.小位移.心电.脑电等[1 ...
- ZOJ Light Bulb - 3203
题意:人左右走动,求影子L的最长长度. 思路:三分人在D上的位置.注意影子长=D-x+H-(H-h)*D/x. #include<iostream> #include<stdio.h ...