为什么派生类函数参数取值基类函数参数?

BSa*_*nke 7 c++ oop inheritance base-class derived-class

我正在研究C++.以下是我的代码:

#include <iostream>
using namespace std;
class base
{
        public:
        virtual void display(int a = 4)
        {
                cout << "base ::  "<<  a*a << endl;
        }
};

class derived : public base
{
        public:
        void display(int b = 5)
        {
                cout << " Derived :: " << b*b*b <<  endl;
        }
};

int main()
{
        base *bobj;
        derived dobj;
        bobj = &dobj;
        bobj->display();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Derived :: 64
Run Code Online (Sandbox Code Playgroud)

调用Base类的函数,但使用派生函数的参数的默认值.为什么派生类方法display(),取基类方法参数值?

Luc*_*ore 7

因为你是通过指针调用它base.这就是它的工作原理.

在实际调用之前,参数在参数堆栈(或寄存器内)上被推送.因为您有一个指向base且没有参数的指针,所以默认值4将传递给该函数.然后调用正确的函数(derived::display),但使用base默认参数.当然,这是一个实现细节,但行为是标准的.

C++ 03 8.4/10

虚函数调用(10.3)使用由表示对象的指针或引用的静态类型确定的虚函数声明中的默认参数.派生类中的重写函数不会从它覆盖的函数中获取默认参数.

我会强调引用,但整个事情都是不言自明的.

dobj.display();
Run Code Online (Sandbox Code Playgroud)

会打印125(5 ^ 3).