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 ...
随机推荐
- Could not locate executable null 解决办法
问题导读: 1.建一个MapReduce Project,运行时发现出问题:Could not locate executable null,该如何解决?2.Could not locate exec ...
- 多线程与网络之NSURLConnection发送请求
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- input子系统 KeyPad-Touch上报数据格式与机制
-----------------------------------------------------------------------本文系本站原创,欢迎转载!转载请注明出处:http://b ...
- cocos2d-x编译到android平台后,增加返回键和菜单键支持
在头文件中增加函数 virtual void keyBackClicked();//android返回键 virtual void keyMenuClicked();//android菜单键 在ini ...
- RHEL6.x 删除Oracle11g
1.停止数据库 $sqlplus /nolog SQL>conn /as sysdba SQL>shutdown immediate 2.停止Listener $lsnrctl stop ...
- ubuntu免验证登陆权限问题
由于经常ssh到服务器,每次输入密码很烦.就传了本机公钥到服务器. 和所有教程将的一样,做起来挺简单的. 本机ssh-keygen -t rsa生成公钥和密钥. 将公钥传至服务器,用户目录下.ssh/ ...
- 我用的Linux命令
从今天起,会在这里记一些我使用过的linux命令 =======I'm 分割线======= 11.查看某个端口号被哪个应用占用 netstat -apn|grep 端口号,lsof -i:端口号,n ...
- hdu 1877 又一版 A+B
又一版 A+B Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 射频识别技术漫谈(13)——Mifare S50与S70【worldisng笔记】
Mifare S50和Mifare S70又常被称为Mifare Standard.Mifare Classic.MF1,是遵守ISO14443A标准的卡片中应用最为广泛.影响力最大的的一员.而Mif ...
- Android 解析 xml
URL httpUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection )httpUrl.openConnection(); c ...