【学习笔记】C++primer plus 13.继承

1. 要使用多态,在基类和派生类的同名函数声明前加上virtual,派生类中可以不加,不过最好添加,增加易读性,没有virtual则指针或引用调用函数时会调用该指针或引用的类型所对应的那一个函数。同理也引申到析构函数上(虚析构函数),通常要给基类定义虚析构函数;

2. 虚函数通过虚参数表来实现,每个对象都有一个隐藏的指向函数地址数组的指针(__vfptr),若派生对象重新定义了虚函数,则vfptr里面相应位置的函数地址就被替换到了正确的函数地址上;

2+. 公有继承建立is-a关系,可以将派生类的引用或指针向上强制转换为基类的引用或指针;

2++. 通过函数的调用来确定应该执行的代码块的过程称为联编(binding),虚函数的使用称为动态联编;

#include <iostream>
#include <string>
using namespace std;

// 源码参考p504

class Scientist {
private:
	string name;
public:
	virtual void show_name() { cout << name; }
	virtual void show_all() { cout << name; }
};

class Physicist : public Scientist {
private:
	string field;
public:
	virtual void show_all() { show_name(); show_field(); }
	virtual void show_field() { cout << field; }
};

int main() {
	Scientist *person1 = new Scientist();
 	Scientist *person2 = new Physicist();
}

用vs2015的执行结果:



3. 基类中的虚函数返回类型是基类指针或引用时,派生类中的对应函数的返回类型可以是派生类指针或引用(返回类型协变);

4. protected 从外面看像是private,从继承类看像是public,最好对成员函数使用,不对成员变量使用;

5. virtual typeName func() = 0 为纯虚函数,定义纯虚函数使得该基类成为抽象类,不可实现;





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值