1,首先可以安全的把问题讨论局限于"继承一个带有缺省参数的虚拟函数"
那么理由非常直接明了:
虚拟函数系动态绑定,而缺省参数却是静态绑定.
实例代码:
#include <iostream>
#include <string.h>
using namespace std;
enum ShapeColor { RED, GREEN, BLUE };
// a class for geometric shapes
class Shape
{
public:
virtual void draw(ShapeColor color = RED)
{
cout << "Shape:" << color << endl;
}
};
class Rectangle: public Shape
{
public:
virtual void draw(ShapeColor color = GREEN) const
{
cout << "Ractangle:" << color << endl;
}
};
int main()
{
Shape* pb1 = new Shape;
pb1 -> draw();
Shape* pb2 = new Rectangle;
pb2 -> draw(); //基类默认
Rectangle* pb3 = new Rectangle;
pb3 -> draw(); //派生类默认
return 0;
}
注意:pb2 -> draw(); //基类默认
当你调用一个定义在Derived class内的虚拟函数时,却使用基类为它指定的缺省参数值.
2,C++为啥要坚持这么运作捏?
答案:又是执行时的效率.
如果缺省参数也是动态绑定,编译器就必须通过某种办法在执行时期为虚拟函数决定适当的缺省参数值.这样的机制更慢更复杂.
分享到:
相关推荐
条款38: 决不要重新定义继承而来的缺省参数值 条款39: 避免 "向下转换" 继承层次 条款40: 通过分层来体现 "有一个" 或 "用...来实现" 条款41: 区分继承和模板 条款42: 明智地使用私有继承 条款43: 明智地使用多继承 ...
条款37:绝不重新定义继承而来的缺省参数值 条款38:通过复合塑模出has-a或“根据某物实现出” 条款39:明智而审慎地使用private继承 条款40:明智而审慎地使用private继承 7.模板与泛型编程 8.定制new和delete...
条款37:绝不重新定义继承而来的缺省参数值 never redefine a function's inherited default parameter value. 条款38:通过复合塑模出has-a或“根据某物实现出” model “has-a” or “is-implemented-in-terms-of...
·条款三:不要使用多态性数组 ·条款四:避免无用的缺省构造函数 ·条款五:谨慎定义类型转换函数 ·条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别 ·条款七:不要...
- **C++新增特性**: C++在保留C语言基本元素的基础上,引入了许多高级概念,包括但不限于私有和保护成员、函数重载、缺省参数、构造与析构函数、自定义操作符、内联函数、引用、友元、模板、异常处理和名字空间等。...
- **参数缺省值**:为函数参数提供缺省值,提高函数的灵活性。 - **运算符重载**:自定义类的行为以适应特定的运算符。 - **函数内联**:通过内联函数减少函数调用开销,提高性能。 - **心得体会**:总结在使用高级...
- **区别**: 指针可以被重新赋值指向其他地方,而引用一旦初始化后就不能改变。此外,指针可以是NULL,而引用必须始终绑定到一个对象。 - **Item 2: 尽量使用C++风格的类型转换** - **静态转换(static_cast)**: ...