c++ primer学习之-----C++ 中的多态性
2011-02-17 18:00
183 查看
引用和指针的静态类型与动态类型可以不同,这是 C++ 用以支持多态性的基石。
通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的。
如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数。如果调用虚函数,则直到运行时才能确定调用哪个函数,运
行的虚函数是引用所绑定的或指针所指向的对象所属类型定义的版本。
在编译时确定非 virtual 调用
覆盖虚函数机制
在某些情况下,希望覆盖虚函数机制并强制函数调用使用虚函数的特定版本,此时需要使用作用域操作符:
Item_base * baseP = &derived;
double d = baseP->Item_base::net_price(42); //这里强制将net_price调用确定为Item_base中定义的版本,该调用将在编译时确定。
只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制。
为什么会希望覆盖虚函数机制?最常见的理由是为了派生类虚函数调用基类中的版本。
虚函数与默认实参
如果有用在给定调用中的默认实参值,该值将在编译时确定。
如果一个调用省略了具有默认值的实参,则所用的值由调用该函数的类型定义,与对象的动态类型无关。通过基类的引用或指针调用虚函数时,默认实参为在基类虚函数声明中指定的值,如果通过派生类的指针或引用调用虚函数,则默认实参是在派生类的版本中声明的值。
通过基类引用或指针调用基类中定义的函数时,我们并不知道执行函数的对象的确切类型,执行函数的对象可能是基类类型的,也可能是派生类型的。
如果调用非虚函数,则无论实际对象是什么类型,都执行基类类型所定义的函数。如果调用虚函数,则直到运行时才能确定调用哪个函数,运
行的虚函数是引用所绑定的或指针所指向的对象所属类型定义的版本。
在编译时确定非 virtual 调用
覆盖虚函数机制
在某些情况下,希望覆盖虚函数机制并强制函数调用使用虚函数的特定版本,此时需要使用作用域操作符:
Item_base * baseP = &derived;
double d = baseP->Item_base::net_price(42); //这里强制将net_price调用确定为Item_base中定义的版本,该调用将在编译时确定。
只有成员函数中的代码才应该使用作用域操作符覆盖虚函数机制。
为什么会希望覆盖虚函数机制?最常见的理由是为了派生类虚函数调用基类中的版本。
虚函数与默认实参
如果有用在给定调用中的默认实参值,该值将在编译时确定。
如果一个调用省略了具有默认值的实参,则所用的值由调用该函数的类型定义,与对象的动态类型无关。通过基类的引用或指针调用虚函数时,默认实参为在基类虚函数声明中指定的值,如果通过派生类的指针或引用调用虚函数,则默认实参是在派生类的版本中声明的值。
相关文章推荐
- C++程序设计学习之『多态性与虚函数』
- C++学习笔记(一)(20120208 C++ Primer)
- C++学习7-面向对象编程基础(多态性与虚函数、 IO文件流操作)
- [C++学习] C++ primer 习题 3.17
- C++ Primer学习笔记2--c++中的数组和指针
- [c++学习] C++ primer 第4版 习题4.20 4.21 常量指针 和 指针常量
- c++学习之--关于多态性
- c++学习总结(多态性)
- 如何更好的利用《C++ Primer》学习C++?
- C/C++学习(1)面向对象的多态性问题、虚函数调用
- C++ Primer学习笔记2--c++顺序容器
- [C++ 学习] C++ primer 第4版 习题4.19
- 从《C++ Primer 第四版》入手学习 C++
- [C++ 学习] C++ Primer 第4版 习题 4.30 字符串操作 & 我对堆内存 和 常量区内存的一些理解
- C++学习笔记之——c++多态性的类指针总结
- C++ Primer学习笔记1--c++基础篇查缺补漏
- [C++学习] C++ Primer 第4版 习题4.28 C++动态数组
- C++学习笔记――多态性和虚函数
- [C++ 学习] C++ Primer 习题 4.36 指针数组 & 数组指针
- c++新手学习笔记之多态性和虚函数(1)