继承关系·
2016-01-02 12:10
337 查看
C++继承方式有公有继承,私有继承,保护继承。值得注意的是,基类私有成员在任用任何继承方式下都是隔离的,也就是视派生类为外人。在公有继承中,基类的每个成员在子类中保证相同的访问方式,在基类为public 成员,则在子类也是public成员,在基类为保护成员则在子类也是保护成员。对于保护继承,基类的公有成员和保护成员继承到子类都变成了保护成员。
C++具有单一继承和多重继承。多重继承在实现时并不容易,主要是编译问题,模糊性问题,调试问题也很多,一般只有高级程序员才使用多重继承。如下例子:
#include<iostream>
using namespace std;
class Furniture{
protected :
double weight;
public:
void setWeight(double i){ weight = i; }
double getWeight(){ return weight; }
};
class Bed :virtual public Furniture{
public:
void sleep();
};
class Sofa :virtual public Furniture{
public:
void wacthTV(){};
};
class SleeperSofa :public Sofa, public Bed{
public:
void floadOut(){};
};
int main(){
SleeperSofa f;
f.setWeight(1.0);
}
上面程序中,Furniture是最初的基类,Bed类和Sofa类都从Furniture虚拟继承而来,而SleepSofa则继承于Bed和Sofa类,若不加上virtual关键字,则会产生歧义,这是由于在子类SleepSofa中继承的weight和setWeight到低来自哪里?是继承自Bed类还是,Sofa类,这样就产生了模糊不清的问题,如今的SleepSofa继承了Furniture的两个副本。当加上virtual关键字后,表明,Bed类和Sofa类都从Furniture虚拟继承,这样后代就保证了只继承一个副本,就不会产生歧义。
C++具有单一继承和多重继承。多重继承在实现时并不容易,主要是编译问题,模糊性问题,调试问题也很多,一般只有高级程序员才使用多重继承。如下例子:
#include<iostream>
using namespace std;
class Furniture{
protected :
double weight;
public:
void setWeight(double i){ weight = i; }
double getWeight(){ return weight; }
};
class Bed :virtual public Furniture{
public:
void sleep();
};
class Sofa :virtual public Furniture{
public:
void wacthTV(){};
};
class SleeperSofa :public Sofa, public Bed{
public:
void floadOut(){};
};
int main(){
SleeperSofa f;
f.setWeight(1.0);
}
上面程序中,Furniture是最初的基类,Bed类和Sofa类都从Furniture虚拟继承而来,而SleepSofa则继承于Bed和Sofa类,若不加上virtual关键字,则会产生歧义,这是由于在子类SleepSofa中继承的weight和setWeight到低来自哪里?是继承自Bed类还是,Sofa类,这样就产生了模糊不清的问题,如今的SleepSofa继承了Furniture的两个副本。当加上virtual关键字后,表明,Bed类和Sofa类都从Furniture虚拟继承,这样后代就保证了只继承一个副本,就不会产生歧义。
相关文章推荐
- c#中==和equals的比较
- 自定义控件: 万能下拉刷新及上拉加载控件SuperRefreshLayout-4
- JNI出现的错误整理
- 设计模式系列8---发号施令的命令模式
- HTML src/href 属性 详解
- 【算法导论】简单哈希表的除法实现
- 1、File类的API
- 使用Python Pandas处理亿级数据
- 高德地图API INVALID_USER_SCODE问题以及keystore问题
- Python标准库12 数学与随机数 (math包,random包)
- Intent的简介以及属性详解
- Java学习笔记·Servlet parameter参数传递utf-8文字编码正常显示
- Unity3D之float Input.GetAxis(string axisname)
- Oracle闪回技术详解
- isLeapYear
- 工作记录:一个模糊匹配关键词搜索的功能需求
- runtime objc_msgSend
- HDU 5107 线段树扫描线
- GeometryServer
- 理论: 图论(7): 无圈图的最短路径和关键路径