一、虚函数
虚函数——类的成员函数前加virtual关键字,则这个成员函数为虚函数
虚函数重写——当在子类定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(覆盖)了父类的虚函数
总结:
1、派生类重写基类的虚函数实现多态,要求函数名、参数列表、返回值完全相同(协变除外)
2、基类中定义虚函数,在派生类中该函数始终保持虚函数的特性
3、只有类的成员函数才能定义为虚函数,静态成员函数和全局函数都不能定义为虚函数
4、如果在类外定义虚函数,只能在声明函数时加virtual,类外定义函数时不能加virtual
5、构造函数不能为虚函数。虽然可以将operator=定义为虚函数,但是最好不要将operator=定义为虚函数,因为使用时容易引起混淆
6、不要在构造函数和析构函数里调用虚函数,在构造函数和析构函数中,对象是不完整的,可能会发生未定义的行为
7、最好把基类的析构函数声明为虚函数(析构函数比较特殊,派生类的析构函数和基类的析构函数名称不一样,但构成了覆盖)
class Person
{
public:
virtual void BuyTickets()
{
cout << "买票" << endl;
}
protected:
char _name;
};
class Student : public Person
{
public:
virtual void BuyTickets()
{
cout << "买票——半价" << endl;
}
protected:
int _num;
};
void Fun(Person & p)
{
p.BuyTickets();
}
void Test()
{
Person p;
Student s;
Fun(p);
Fun(s);
}
int main()
{
Test();
system("pause");
return 0;
}
二、纯虚函数
在成员函数的形参列表后面写上=0,则成员函数为虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。纯虚函数在派生类中重定义以后,派生类才能实例化出对象。
三、友元与继承
友元关系不能继承,也就是说基类友元不能访问子类私有和保护成员。
四、继承与静态成员
基类定义了static成员,则整个继承体系里只有一个这样的成员。无论派生出多少个子类,都只有一个static成员实例。
class Person
{
public:
Person(){ ++_count; }
protected:
string _name;//姓名
private:
static int _count;//统计人的个数
};
int Person::_count = 0;
class Student : public Person
{
protected:
int _num;//学号
};
class Graduate :public Student
{
protected:
string _seminarCourse;//研究项目
};
void Test()
{
Student s1;
Student s2;
Student s3;
Graduate s4;
cout << "人数:" << Person::_count << endl;
Student::_count = 0;
cout << "人数:" << Person::_count << endl;
}
int main()
{
Test();
system("pause");
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/c083694f5593b502e5d0fdddb77bf62b.png)