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 ...
随机推荐
- ODAC连接远程Oracle数据库时,数据源名称orcl改为gscloud
今天用ODAC连接远程Oracle数据库时,怎么也连接不上, 更改配置文件的tnsname.ora,使之都一样,并完全配置正确还是出现错误,连接不上. 最后请大神一世,原来是数据源名称的问题. 把数据 ...
- 求一字符串最长不重复字符子串的长度【Java 版】
一. 前言 最近学习有点断断续续,整理的一些知识点要么不完整,要么完全没搞懂,不好拿上台面,还是先在草稿箱躺着吧.偶尔在浏览大牛博客http://coolshell.cn的时候,发现大牛业余时间也在做 ...
- vs2010中的快捷键
1.Ctrl+TAB vs中各个页进行切换. 2.shift+alt+F10 用于帮助绑定选定项的选项.就用于写了一个类(Regex),需要导入其所在命名空间时(using System.Text. ...
- 【译】 AWK教程指南 3计算并打印文件中指定的字段数据
awk 处理数据时,它会自动从数据文件中一次读取一条记录,并会将该记录切分成一个个的字段:程序中可使用 $1, $2,... 直接取得各个字段的内容.这个特色让使用者易于用 awk 编写 reform ...
- WAMP下 搭建Zend Framework(Hello World)实例
一.环境搭建 1.下载安装Zend Framework,此步骤不再详细叙述 2.配置php.ini文件 打开php.ini文件,可以找到如下的代码: ; Windows: "\path1;\ ...
- Eclipse Class Decompiler影响class默认打开方式,重新设置Eclipse默认源码打开方式
安装Eclipse Class Decompiler插件后,Eclipse中的默认源码打开方式被修改为Eclipse Class Decompiler 这不是我喜欢的,因为我希望,源码从网络中获取,当 ...
- 【noip2005】篝火晚会
题解: 首先我们要知道一个性质: 把长度为n的序列变成目标序列最多需要n个操作 证明1: 我们可以将原序列上每位上的数字向目标序列相同位置的数字连一条有向边 如: 原序列: 1 2 3 目标序列: ...
- Hadoop概念学习系列之例子形象再谈Client、NameNode、元数据(三十一)
Client相当于是送货人或提货人. NameNode相当于是仓库管理员. 元数据相当于是账本清单.
- ACCESS-关于DELPHI中操作ACCESS数据库中单精度数据的问题
在近日几个帖子里面,和QQ群的讨论里面,我发现很多网友都遇到的问题都是因为不恰当地使用了单精度/双精度数值.因此想专门就这个话题谈一下. 单精度和双精度数值类型最早出现在C语言中(比较通用的语言里面) ...
- jQuery plugin : jqTransform
Usage 1- Add javascript inclusion in the header section of your web page //required <script type= ...