1.函数重载:
C++中函数的一种特殊情况,在同一个作用域下,函数名相同,形参列表(参数个数,类型,顺序)不同的函数
//重载函数
int add(int left,short right){
return left + right;
}
//参数类型不同
int add(short left,short right){
return left + right;
}
//参数顺序不同
int add(short left,int right){
return left + right;
}
//参数个数不同
int add(int left,short right,int middle){
return left + right + middle;
}
二、函数重写
虚函数:类的成员函数前加virtual关键字
class person{
public:
virtual void Back(){
cout << "虚函数" << endl;
}
};
虚函数重写:
- 两个函数分别在基类和派生类的作用域中
- 函数名/参数/返回值必须完全相同
- 两个函数为虚函数
class person{
public:
virtual void Back(int a){
cout << "基类虚函数" << endl;
}
};
class student : public person{
public:
virtual void Back(int a){
cout << "派生类虚函数" << endl;
}
};
虚函数重写的例外—>协变
重写的虚函数返回值可以不同,但必须是派生类指针和基类指针或者派生类引用和基类引用
class A{
};
class B : public A {
};
class Person {
public:
virtual A* f() {
return new A;
}
};
class Student : public Person {
public:
virtual B* f() {
return new B;
}
};
不规范的函数重写:在派生类中重写的成员函数可以不加virtual关键字,因为继承后基类的虚函数被继承了,保持了其虚函数的属性
析构函数的重写
基类中的析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数。这里他们的函数名不相 同,看起来违背了重写的规则,其实不然,这里可以理解为编译器对析构函数的名称做了特殊处理,编译后 析构函数的名称统一处理成destructor,这也说明的基类的析构函数最好写成虚函数。
class Person {
public:
virtual ~Person() {
cout << "~Person()" << endl;
}
};
class Student : public Person {
public:
virtual ~Student() {
cout << "~Student()" << endl;
}
};
// 只有派生类Student的析构函数重写了Person的析构函数,下面的delete对象调用析//构函数,才能构成多态,才能保证p1和p2指向的对象正确的调用析构函数。
int main(){
Person* p1 = new Person;
Person* p2 = new Student;
delete p1;
delete p2;
return 0;
}
函数重定义
- 两个函数分别在基类和派生类的作用域
- 函数名相同
- 两个派生类和基类同名函数不构成重写就构成重定义
class person{
public:
virtual void Back(int a){
cout << "基类虚函数" << endl;
}
};
//构成重定义时,也可以不加virtual关键字
class student : public person{
public:
virtual void Back(short a){
cout << "派生类虚函数" << endl;
}
};