虚函数可以有默认参数吗?
问题:
声明虚函数时基类中带有默认参数,派生类是否继承这些参数默认值?
答案:
不,虚函数中的默认值不会被派生类继承。使用的默认值由调用函数时对象的静态类型决定。
说明:
C 标准(C 03 和 C 11)指定虚函数调用使用在函数定义中声明的默认参数,该参数由用于调用该函数的指针或引用的静态类型决定。
示例:
考虑以下代码:
struct Base { virtual void f(int a = 7); }; struct Der : public Base { void f(int a); };
通过指向 Base 对象的指针调用 f() 时,默认值 7 将被使用:
Base* pb = new Base; pb->f(); // uses the default 7
但是,当通过指针调用 f() 时Der 对象,将不会使用派生类的默认值:
Der* pd = new Der; pd->f(); // error: no default argument for this function
实践和编译器注意事项:
虽然 C 标准规定了行为,但某些编译器可能会以不同的方式实现虚函数默认参数。但是,建议遵循标准的指南,以确保跨编译器的行为一致。
代码演示:
以下代码演示了默认参数行为:
struct Base { virtual string Speak(int n = 42); }; struct Der : public Base { string Speak(int n = 84); }; int main() { Base b1; Der d1; Base *pb1 = &b1, *pb2 = &d1; Der *pd1 = &d1; cout << pb1->Speak() << "\n" // Base 42 << pb2->Speak() << "\n" // Der 42 << pd1->Speak() << "\n" // Der 84 << endl; }
输出:
Base 42 Der 42 Der 84
以上是虚函数中的默认参数会继承到派生类吗?的详细内容。更多信息请关注PHP中文网其他相关文章!