虚函数小记
-
虚函数
-
虚成员函数和动态联编: BrassPlus为一个子类,Brass为基类 BrassPlus ope; Brass*bp; bp = &ope; bp->viewAcct(); //viewAcct()在基类和子类中实现不同 //如果在基类中没有将viewAcct()声明为虚的,则bp->viewAcct()将根据指针类型(Brass*)调用Brass::ViewAcct(),所以编译器对非虚方法使用静态联编。 //然而如果在基类中将viewAcct()声明为虚的,则bp->ViewAcct()将根据对象类型(BrassPlus)调用BrassPlus::ViewAcct().即编译器对虚方法采用动态联编 (1)如果要在派生类中重新定义基类的方法,则将它设置为虚方法;否则,设置为非虚方法 (2)虚函数工作原理:编译器处理虚函数的方法:给每个对象添加一个隐藏成员。隐藏成员中保存了一个指向函数地址数组的指针。这种数组成为虚函数表(vtbl)。虚函数表中存储了为类对象进行声明的虚函数的地址。
-
虚函数的一些其他知识:
- 构造函数不能是虚函数
- 析构函数应当是虚函数,除非类不用做基类 virtual ~BaseClass(){}
- 通常应给基类提供一个虚析构函数,即使它并不需要析构函数
- 友元不能是虚函数,因友元不是类成员,而只有成员才能是虚函数
- 如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返回类型是基类引用或指针,则可以修改为指向派生类的引用和指针
- 如果基类声明被重载了,则应在派生类中重新定义所有的基类版本
-
访问控制:protected 与private类似,在类外只能用公有类成员来访问protected部分中的类成员。但派生类的成员可以直接访问基类的保护成员,但不能直接访问基类的私有成员 //最好对类数据成员采用私有访问控制,不要使用保护访问控制
-