C++虚函数默认实参的注意事项

我们都知道当成员函数是虚函数的时候,函数调用取决于调用函数的对象的类型而不是指针或者应用的类型。这就是C++中的多态。

那么一个虚函数的实参的缺省值是什么呢?例如如下代码:

#include <iostream>
#include <string>
using namespace std;

class A
{
public:
    virtual void func(int number = 10)
    {
        cout << "A::func() " << number << endl;
    }
};

class B : public A
{
public:
    virtual void func(int number = 20)
    {
        cout << "B::func() " << number << endl;
    }
};

int main(int argc, char **argv)
{
    B b;
    A &a = b;

    b.func();
    b.func(99);
    a.func();
    a.func(99);
    return 0;
}

运行结果是:

B::func() 20
B::func() 99
B::func() 10
B::func() 99

由上面的运行结果我们可以得到,即使动态调用了子类的 func() 函数,那么函数的缺省值仍然还是基类中定义的缺省值 10;

由此可见,虚函数的缺省值取决于调用函数的指针或者引用的类型而不是对象本身的类型。

时间: 2025-01-01 21:17:49

C++虚函数默认实参的注意事项的相关文章

&lt;转&gt;C++继承中虚函数的使用

转自:http://blog.csdn.net/itolfn/article/details/7412364 一:继承中的指针问题. 1. 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承 而来的那些成员,不能访问子类特有的元素 ,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;D  dd; p=&dd;是可以的,指针p只能访问从基类派生而来的成员,不能访问派生类D特有的成员.因为基类不 知道派生类中的这些成员. 2. 不能使派生类

C++虚函数的默认参数问题

#include "stdafx.h" #include <iostream> #include <algorithm> using namespace std; class Base { public: Base(int i):m_num(i) { cout<<"Base Constructor"<<endl; } virtual ~Base() { cout<<"Base Deconstruc

【转】深入理解C++的动态绑定和静态绑定 &amp; 不要重定义虚函数中的默认参数

为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误.需要理解四个名词:1.对象的静态类型:对象在声明时采用的类型.是在编译期确定的.2.对象的动态类型:目前所指对象的类型.是在运行期决定的.对象的动态类型可以更改,但是静态类型无法更改.关于对象的静态类型和动态类型,看一个示例: class B { } class C : public B { } class D : public B { } D* pD = new D();//p

特殊用途语言特性:默认实参,内联函数和constexpr函数,调试帮助

重点: 1.三种函数相关的语言特性:默认实参,内联函数和constexpr函数. 2.默认实参:某些函数有一种形参,在函数的很多次调用中它们都被赋予一个相同的值. 3.一旦某个形参被赋予了默认值之后,它后面的所以形参都必须要默认值. 4.若想使用默认形参,只要在调用函数时省略该实参即可. Tip:Window = screen ( , , ‘?’ );//错误:只能省略尾部的实参! 5.对于函数的声明来说,习惯将其放在头文件当中,在给定的作用域中一个形参只能赋予一次默认实参. NOTE:通常,应

C++虚函数与默认参数

假设有如下类: 1 class Base { 2 public: 3 virtual void disp(int x = 3) {//虚函数带默认参数值,3 4 cout << "Base::x is " << x << endl; 5 } 6 }; 7 class Derived: public Base { 8 public: 9 virtual void disp(int x = 100) {//子类重定义了默认参数值,100 10 cout

为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数

将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏. C++默认的***析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存***.而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存.因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数. C++中析构函数的作用析构函数与构造函数对应,当对象结束其生命周期,如对象所在的函数已调用完毕时,系

[014]析构函数为虚函数的注意事项

1.当析构函数为虚函数时,其所有派生类的析构函数都将自动成为虚函数(不管是否被标记为virtual). 2.当基类的析构函数为虚函数时,如果对子类调用析构函数时,程序会先调用派生类的析构函数,然后再去调用基类的析构函数. 但如果基类的析构函数不是虚函数时,那么只会调用基类的析构函数. 例: class Base { virtual ~Base() {}; .... }; class Device :public Base { ~Device() {}; }; Base *pB = new Dev

【核心基础】虚函数

本节研究虚函数的相关问题: 虚函数表 无继承 代码片段 class Animal { public: Animal(int age) : _age(age) { } virtual void f() { cout << "Animal::f " << _age << endl; } virtual void g() { cout << "Animal::g " << _age << endl;

虚函数 动态绑定 实现方式是:虚函数表

定义为 virtual的 函数是基类期待派生类(derived class)重定义的, 基类期待 派生类继承的函数不能定义为虚函数. 动态绑定:程序能 使用继承层次中任意类型的对象,无需关心对象的具体类型.  使用这些类的程序无须区分函数在基类还是在继承类中定义的. 尽管不是必须,派生类一般会重定义基类中的虚函数.如果没有重定义,则继承基类中定义的版本.派生类中虚函数的声明原型必须与基类中的定义方式完全匹配,但有一个例外:基类中返回值是对基类性的引用(或指针)的虚函数,在派生类中虚函数可以返回