C++ : 继承问题 [virtual函数调用,为什么禁止在virtual使用默认参数]
文章目录
- 子类指针,父类指针分别调用virtual函数,与非virtual函数
- 虚函数中尽量不要使用默认参数!!!
子类指针,父类指针分别调用virtual函数,与非virtual函数
virtual函数,通过指针调用的是子类函数
非virtual函数,取决于指针的类型
class Person {
public:
void Print()
{
cout << "Person" << endl;
}
virtual void VirtualPrint()
{
cout << "VirtualPrint Person" << endl;
}
};
class Studen : public Person {
public:
void Print()
{
cout << "Student" << endl;
}
virtual void VirtualPrint()
{
cout << "VirtualPrint Student" << endl;
}
};
int main()
{
Person *p = new Studen();
Studen *s = new Studen();
p->Print(); // Person
s->Print(); // Student
p->VirtualPrint(); // VirtualPrint Student
s->VirtualPrint(); // VirtualPrint Student
return 0;
}
虚函数中尽量不要使用默认参数!!!
class Father {
public:
void func1(int val = 100){
cout << "Father \t: func1" << "\t" << val << endl;
}
virtual void func2virtual(int val = 100){
cout << "Father \t: func2" << "\t" << val << endl;
}
};
class Son : public Father {
public:
void func1(int val = 200){
cout << "Son \t: func1" << "\t" << val << endl;
}
virtual void func2virtual(int val = 200){
cout << "Son \t: func2" << "\t" << val << endl;
}
};
当指针类型与实体类型一致时,很容易分清楚其调用规则
void group1()
{
Father *f = new Father();
Son *s = new Son();
f->func1();
s->func1();
// Father : func1 100
// Son : func1 200
f->func1(300);
s->func1(300);
// Father : func1 300
// Son : func1 300
f->func2virtual();
s->func2virtual();
// Father : func2 100
// Son : func2 200
f->func2virtual(300);
s->func2virtual(300);
// Father : func2 300
// Son : func2 300
}
当指针类型与实体类型不一致时,很不容易分清楚其调用规则
在virtual函数中使用默认参数,因为virtual是动态绑定,导致都是调用了子类函数,但是默认参数是根据指针类型来使用的
void group2()
{
Father *f = new Son();
Son *s = new Son();
f->func1();
s->func1();
// Father : func1 100
// Son : func1 200
f->func1(300);
s->func1(300);
// Father : func1 300
// Son : func1 300
// virtual func use dynamic func, but use ptr default args
// 重点处
f->func2virtual();
s->func2virtual();
// Son : func2 100
// Son : func2 200
// virtual func use dynamic func, use given args
f->func2virtual(300);
s->func2virtual(300);
// Son : func2 300
// Son : func2 300
}