C++入门经典 笔记 (第十七章)使用多态和派生类
2015-09-05 17:47
495 查看
多态即意味着具有多种形态,要使用多态,必须明白前一章所说的派生类的对象也可视为基类对象。将这些派生类对象视为基类对象而调用基类方法时,便使用了多态。
要使用多态,可声明一个基类指针,并将在堆中创建一个派生类对象的地址赋给它。比如(基类:Mammal和派生类:Dog),由于派生类对象也是基类对象,所以下面的代码是合法的:Mammal * pMammal = new Dog; 然后就可以用该指针对Mammal调用任何成员函数。在调用重写了的函数时,将根据指针指向的对象类型,调用正确的函数。注意:在基类中,被调用的重写的函数必须用virtual关键字修饰,即它是虚函数。不然,当调用该函数时,就会实现基类的方法而不是指针指向的对象的方法,这就达不到多态的效果了。
不能通过基类指针访问派生类特有的方法
如果Dog有成员函数WagTail(),但是Mammal没有,就不能通过Mammal指针来访问它(除非将其转换为Dog指针)。
使用虚成员函数的代价
包含虚成员函数的类必须维护一个虚函数表(v-table),因此使用虚函数会带来一些开销,如果类很小,并且不打算从它派生出其他类,就根本没必要使用虚函数。
问:如果基类的一个函数(Somefunc())是虚函数,且被重载以便能接受一个或两个int参数,而在派生类重写了接受一个int参数的版本,那么通过指向派生类对象的指针调用接受两个int参数的函数时,将调用哪个函数?
答:重写接受一个int参数的版本将隐藏基类中所有同名函数,因此将出现编译出错,指出该函数只接受一个int参数。
要使用多态,可声明一个基类指针,并将在堆中创建一个派生类对象的地址赋给它。比如(基类:Mammal和派生类:Dog),由于派生类对象也是基类对象,所以下面的代码是合法的:Mammal * pMammal = new Dog; 然后就可以用该指针对Mammal调用任何成员函数。在调用重写了的函数时,将根据指针指向的对象类型,调用正确的函数。注意:在基类中,被调用的重写的函数必须用virtual关键字修饰,即它是虚函数。不然,当调用该函数时,就会实现基类的方法而不是指针指向的对象的方法,这就达不到多态的效果了。
不能通过基类指针访问派生类特有的方法
如果Dog有成员函数WagTail(),但是Mammal没有,就不能通过Mammal指针来访问它(除非将其转换为Dog指针)。
使用虚成员函数的代价
包含虚成员函数的类必须维护一个虚函数表(v-table),因此使用虚函数会带来一些开销,如果类很小,并且不打算从它派生出其他类,就根本没必要使用虚函数。
问:如果基类的一个函数(Somefunc())是虚函数,且被重载以便能接受一个或两个int参数,而在派生类重写了接受一个int参数的版本,那么通过指向派生类对象的指针调用接受两个int参数的函数时,将调用哪个函数?
答:重写接受一个int参数的版本将隐藏基类中所有同名函数,因此将出现编译出错,指出该函数只接受一个int参数。
相关文章推荐
- C语言基础知识之(二十):指针高级运用
- C++ 多继承和虚继承的内存布局(Memory Layout for Multiple and Virtual Inheritance )
- C++ DateTime 结构
- C++和C语言混编
- 小解C++模板特化
- c语言之单链表的创建及排序
- C++中的类拷贝构造函数和模板拷贝构造函数
- POJ C++程序设计 编程题#1 List
- C++模板学习之单链表的实现
- 考虑用赋值运算符(op=)取代其单独形式(op)(More Effective C++_22(效率))
- c++primer之顺序容器(添加元素)
- operator new在C++中的各种写法
- C++11 区间迭代
- 用C++写个方法,打印输入文件的最后K行
- C++中static_cast和dynamic_cast
- 关于SAPI的两段小代码(c++)
- C++入门经典 笔记 (第十六章)使用继承扩展类
- 【c++】大牛解析虚函数表
- 浅谈C++设计模式之单例模式
- 利用重载避免隐式类型转换(More Effective C++_21(效率))