C++温故而知新----4

来源:互联网 发布:分析家免费炒股软件 编辑:程序博客网 时间:2024/05/17 07:37
存疑概念:

提醒:

重要知识点:
第十三章 
13.1 一个简单的基类
13.1.1派生一个类
class 基类:public 子类{}
。使用共有派生,基类的共有成员将成为子类的公有成员
。私有部分也派生为子类的一部分,只能通过基类公有方法和保护方法访问

子类具有的特征
。子类对象储存来基类的数据成员
。派生类可以使用基类的方法

需要在继承中添加
。子类需要自己的构造函数
。派生类可以根据需要添加数据成员和方法

13.1.2构造函数:访问权限的考虑
。基类对象在程序进入派生类构造函数之前被创建
子类::子类(参数1,参数2...参数n):基类(参数1,参数2...参数n){}
若不显示调用基类构造函数,默认隐式调用基类无参构造函数

。将基类对象传递给子类构造函数,子类构造函数可以显示调用复制构造函数
子类::子类(基类对象):基类(基类对象){}

。释放对象的顺序与构造相反
首先执行子类析构函数,再执行基类析构函数

13.1.3使用派生类
13.1.4派生类和基类之间的特殊关系
。基类的引用和指针可以指向派生类,反之不行
。可以用派生类对象初始化基类(复制构造函数兼容)
Extend e = Extend();
Basic b0(e);
。可以将派生类对象赋给基类(赋值运算符函数函数兼容)
Basic b1;
b1 = e;

13.2继承:is-a关系
。公有继承使用is-a关系

13.3 多态公有继承
。virtual,若方法是通过引用或指针而不是对象调用,他将确定使用哪种方法
若无virtual修饰,程序将根据引用类型或指针类型选择方法
若有virtual修饰,程序将根据引用或指针指向的对象的类型选择方法

方法在基类中声明为虚,子类中奖自动生成虚方法

基类声明一个虚析构方法,确保按正确顺序调用析构函数
。为何需要虚析构函数
若不使用虚析构函数,则将只调用对应于指针类型的析构函数

13.4静态联编和动态联编
。编译过程中进行联编,静态联编
。程序运行时进行联编,动态联编
隐式向上强制转换使基类指针或引用可以指向子类对象(需使用虚函数)
13.4.2虚成员函数和动态联编
2.虚函数工作原理
给每个对象添加一个隐藏成员。保存来一个指向函数地址数组的指针,即虚函数表。
。基类虚函数表保存虚函数地址
。子类保存未修改的虚函数和被修改或新增的虚函数地址

13.4.3虚函数注意事项
。基类中声明的虚函数,在其所有子类中皆为虚函数(包括子类的子类)
。动态联编
。若定义的类将被作为基类,则应当将要在子类中重新定义的方法声明为虚

1.构造函数不能为虚
2.析构函数应当为虚
3.友元函数不能是虚函数
4.没用重新定义
函数将为基类版本或最新虚函数版本,例外情况是基类版本是隐藏的
5.重新定义将隐藏方法
重新定义继承方法不是重载,会隐藏继承方法

1.若重新定义继承方法,应确保与原来的原型完全一样,若返回值为基类引用或指针,则可以改成指向派生类的引用或指针(返回类型协变)
2.若基类声明被重载,则应在派生类中定义所有基类版本

13.5 访问控制:protected
派生类可直接访问基类protected方法

13.6 抽象基类
纯虚函数
原型后加=0,成为纯虚函数。
类声明包含纯虚函数,则不能创建对象

13.7 继承和动态内存分配
13.7.1第一种情况:派生类不使用new
。基类使用了动态内存分配
派生类不需要定义显示析构函数、复制构造函数、赋值运算符
。默认析构函数自动调用基类构造函数
。默认复制构造函数使用基类复制构造函数复制基类部分
。默认赋值运算符,自动使用基类的赋值运算符对基类组件进行赋值

*以上属性也适用于本身是对象的类成员
13.7.2第二种情况:派生类使用new
。派生类使用了new
必须为派生类定义显示析构函数、复制构造函数、赋值运算符
。析构函数
派生类析构函数自动调用基类析构函数
。复制构造函数
需要显示调用基类构造函数
hasDMA::hasDMA(const hasDMA &hs)
: baseDMA(hs)
{...}
。赋值运算符
hasDMA & hasDMA::operator=(const hasDMA &hs)
{
if(this == &hs)
return *this;
baseDMA::operator=(hs);//相当于*this = hs;
delete [] style;
style = new char[strlen(hs.style) + 1];
strcpy(style,rs.style);
return *this;
}
13.7.3使用动态内存分配和友元的继承
派生类访问基类友元
std::ostream & operator << (std::ostream &os,const hsaDMA &hs)
{
os << (const baseDMA &)hs;
os << "Style:" << hs.style <<endl;
return os;
}

13.8 类设计回顾
13.8.1编译器生成的成员函数
1.默认构造函数
2.复制构造函数
浅复制
3.赋值运算符
若成员是类,成员赋值时使用相应的类复制运算符
13.8.2其他的类方法
1.构造函数
不能被继承
2.析构函数应当为虚
对于基类,即使他不需要析构函数,也应该提供一个虚析构函数
3.转换
。使用一个参数就可以调用的构造函数,定义了从参数类型到类类型的转换
。要将类对象转换为其他类型,应定义转换函数
4.按值传递的对象与传递引用
5.返回对象和返回引用
6.使用const


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 求购梅干菜 梅干菜粉蒸肉 怎样做梅干菜 梅干菜哪里卖 哪里卖梅干菜 梅干菜小龙虾 收购梅干菜 梅干菜汤 梅干菜鸡爪 怎么做梅干菜 梅干菜馅饼 梅干菜排骨 梅干菜昂刺鱼 梅干菜夹饼 梅干菜肉饭 梅干菜炒饭 梅干菜肉丸 梅干菜肉丝 梅干菜饼培训 梅干菜肉烧饼 梅干菜加工 梅干菜泡饭 梅干菜豆腐 购买梅干菜 梅干菜怎么 梅干菜上火 梅干菜制作 梅干菜烧饼怎么做 梅干菜蒸鱼 梅干菜烤肉 梅干菜豆角 炒梅干菜 梅干菜怎么发 梅干菜河虾 发梅干菜 梅干菜切菜机 如何做梅干菜 怎么做梅干菜扣肉 梅干菜精神 梅干菜是 梅干菜蒸肉的做法