C++ - 虚函数(virtual function)缺省参数的异常表现 及 正确使用方法
2014-04-14 15:20
591 查看
虚函数(virtual function)缺省参数的异常表现 及 正确使用方法
本文地址: http://blog.csdn.net/caroline_wendy/article/details/23679691避免定义基类(base class)虚函数的缺省参数, 如果基类虚函数包含缺省参数, 派生类不要重新定义,
会产生异常;
虚函数(virtual)是动态绑定(dynamically bound),缺省参数是静态绑定(statically
bound).
如果派生类(derived class)重新定义缺省值,
实例化, 执行函数正常;
但在动态绑定时, 会出现,执行基类的缺省参数, 却是派生类的行为, 这样的异常举动.
talk is cheap, show you the code.
注意观察动态绑定时, pr的输出, 表现为基类的缺省参数, 派生类的动作.
代码:
/* * test.cpp * * Created on: 2014.04.14 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <string> using namespace std; class Shape { public: enum ShapeColor {Red, Green, Blue}; virtual void draw(ShapeColor color = Red) const = 0; }; class Rectangle : public Shape { public: virtual void draw(ShapeColor color = Green) const { std::cout << "Rectangle : "; switch (color) { case Red : std::cout << "color = " << "Red" << std::endl; break; case Green : std::cout << "color = " << "Green" << std::endl; break; case Blue : std::cout << "color = " << "Blue" << std::endl; break; default: break; } } }; class Circle : public Shape { public: virtual void draw(ShapeColor color) const { std::cout << "Circle : "; switch (color) { case Red : std::cout << "color = " << "Red" << std::endl; break; case Green : std::cout << "color = " << "Green" << std::endl; break; case Blue : std::cout << "color = " << "Blue" << std::endl; break; default: break; } } }; int main() { Rectangle R; Circle C; R.draw(); //C.draw(); //报错, 静态绑定无法继承参数 Shape* pr = new Rectangle; //动态绑定 Shape* pc = new Circle; pr->draw(Shape::Blue); pc->draw(Shape::Blue); pr->draw(); //静态绑定, 使用基类的默认参数, 完成派生类的动作 pc->draw(); return 0; }
输出:
Rectangle : color = Green Rectangle : color = Blue Circle : color = Blue Rectangle : color = Red Circle : color = Red
如果想使用基类虚函数的缺省参数, 派生类不提供参数, 则需要使用NVI(non-virtual interface)的方法,
可以直接使用默认参数;
但是, 绝对不要重新定义一个继承而来的缺省参数值.
如, 以下代码中, Rectangle的私有虚函数, doDraw()不要提供默认参数.
代码:
/* * test.cpp * * Created on: 2014.04.14 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #include <string> using namespace std; class Shape { public: enum ShapeColor {Red, Green, Blue}; void draw(ShapeColor color = Red) const { doDraw(color); } private: virtual void doDraw(ShapeColor color) const = 0; }; class Rectangle : public Shape { private: virtual void doDraw(ShapeColor color) const { std::cout << "Rectangle : "; switch (color) { case Red : std::cout << "color = " << "Red" << std::endl; break; case Green : std::cout << "color = " << "Green" << std::endl; break; case Blue : std::cout << "color = " << "Blue" << std::endl; break; default: break; } } }; int main() { Rectangle R; R.draw(); Shape* pr = new Rectangle; //动态绑定 pr->draw(Shape::Blue); pr->draw(); return 0; }
输出:
Rectangle : color = Red Rectangle : color = Blue Rectangle : color = Red
相关文章推荐
- Windows,C/C++_字符串转换_MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解
- C++多线程传参,CreateThread参数的使用方法
- MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解,实现字符编码转换、宽字符和字符的转换
- C# 调用C++DLL参数异常解决方法
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- c++静态绑定和动态绑定以及虚函数中缺省参数的绑定
- C++中理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异(11)---《More Effective C++》
- Django的URLconf中使用缺省视图参数的方法
- springMVC正确使用GET POST PUT和DELETE方法,如何传递参数
- 默认参数是C++的特性,C中不支持 —— 在C中通过默认参数列表使用默认参数的方法
- C++多线程传参,CreateThread参数的使用方法
- C++中异常类的使用方法
- C++缺省参数函数简介和使用
- SPSS软件包中非参数检验方法的正确使用
- MultiByteToWideChar和WideCharToMultiByte的正确使用方法及参数详解
- C++ template的一些高级用法(元编码,可变参数,仿函数,using使用方法,. C++ 智能指针)
- c++中main函数的参数argv[]参数名不能正确显示的解决方法
- c++中异常类的使用方法
- C++中异常类的使用方法
- C++中异常类的使用方法