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(); // Persons->Print(); // Studentp->VirtualPrint(); // VirtualPrint Students->VirtualPrint(); // VirtualPrint Studentreturn 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 200f->func1(300);s->func1(300);// Father : func1 300// Son : func1 300f->func2virtual();s->func2virtual();// Father : func2 100// Son : func2 200f->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 200f->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 argsf->func2virtual(300);s->func2virtual(300);// Son : func2 300// Son : func2 300
}