注意:虚函数中尽量不要使用默认参数!!!
父类
#pragma once
class Base {
public:
Base();
~Base();
virtual void setNumber(int num = 2) = 0;
};
#include "Base.h"
Base::Base() {
}
Base::~Base() {
}
子类
#pragma once
#include "Base.h"
class A :public Base {
public:
A();
~A();
virtual void setNumber(int num = 4)override;
};
#include "A.h"
#include <QDebug>
A::A() {
}
A::~A() {
}
void A::setNumber(int num ) {
qDebug() << num;
}
调用
Base* a1 = new A;
a1->setNumber(9);
Base* a2 = new A;
a2->setNumber();
A* a3 = new A;
a3->setNumber();
大家猜猜输出结果是多少?
正确答案是:
9
2
4
这是因为带有默认参数的虚函数,在使用默认参数的时候是静态绑定的,默认参数值是由声明的指针类型的默认参数决定的,而不是由对象的类型默认参数决定。
也就是说,在没有输入默认参数的情况下,编译期由指针的类型决定了参数,如果输入了参数则是动态绑定,根据对象的类型来决定调用哪个函数。
aaa