在阅读vptr和vtable概念时,我得到了这段精彩的代码,但我无法弄清楚这里涉及的概念:
#include <iostream>
using namespace std;
class A
{
public:
virtual void foo(int x = 10)
{
cout << "base x : " << x << "\n";
}
virtual void bar()
{
cout << "base bar\n";
}
};
class B : public A
{
public:
virtual void foo(int x = 20)
{
cout << "derived x : " << x << "\n";
}
private:
virtual void bar()
{
cout << "derived bar\n";
}
};
class C : public B
{
};
int main()
{
A x; x.foo(); // x.foo(10);
B y; y.foo(); // x.foo(20);
A *p(&y);
p->foo();
}
现在我得到的输出是:
base x : 10
derived x : 20
derived x : 10
即使在打印派生的x(即B :: foo())时,默认参数是基函数(即A :: foo())怎么可能?
答案 0 :(得分:1)
答案 1 :(得分:1)
C ++标准第8.3.6节第10节提到:
虚函数调用(10.3)使用的默认参数 声明由静态类型确定的虚函数 表示对象的指针或引用。最重要的功能 在派生类中,不从中获取默认参数 功能它覆盖。
在您的示例中,默认参数的评估是基于&#34; p&#34;的类型完成的。这是&#34; A&#34;。因此,默认参数的评估是从A的声明完成的,函数的调用是通过vptr表中的常规查找来完成的。