目录
1、virtual
1)虚函数的调用取决于对象开辟空间的类型,而不是指针或者引用指向的类型;(多态)
2)含有虚函数的类,有虚函数表和虚函数指针;
3)虚函数表:每一个含有虚函数的类都会维护一个虚函数表,在表内,按顺序记录虚函数的地址;
4)虚函数指针:一个指向虚函数表的指针,每个对象都会拥有一个这样的指针;
5)虚函数指针通过this来访问,所以虚函数不能是static函数;
6)虚函数表在编译阶段创建,虚函数指针在构造中创建,所以构造函数不能是虚函数;
7)一个类可能被继承,那么最好将析构函数声明为虚函数,以防对象析构时调错析构函数。
2、虚函数中的默认参数
#include <iostream>
using namespace std;
class A
{
public:
virtual void fun(int x = 1)
{
cout << "A, x = " << x << endl;
}
};
class B : public A
{
public:
virtual void fun(int x = 2)
{
cout << "B, x = " << x << endl;
}
};
int main()
{
B b;
A *pA = &b;
pA->fun();
b.fun();
system("pause");
}
/*
输出结果:
B, x = 1
B, x = 2
*/
总结:
调用函数的类型是什么,就用该类型的默认参数。
1)调用函数对象的类型是什么,就调用那个类型的函数:pA的类型是A,所以输出1、b的类型是B,所以输出2;
2)默认参数不包含在函数签名中,所以默认参数不是用来判断函数是否相同的条件;
3)尽量不要重新定义继承来的默认参数。
3、虚函数和内联函数
inline可以修饰虚函数,但是一般不会定义内联虚函数。
1)内联函数:编译器在编译阶段进行展开,而虚函数的多态是在程序运行期间,因此虚函数为多态性质时不可以内联;
2)inline virtual 唯一可以内联的时候是:编译器具有实际对象而不是对象的指针或引用时才会发生,在这种情况下不会发生多态。
4、纯虚函数和抽象类
1)纯虚函数:含有virtual void funtion()=0;类型的函数。纯虚函数要求继承类必须实现该方法;
2)抽象类:含有纯虚函数的类是抽象类,抽象类不允许创建对象。
纯虚函数的特点:
1)必须在继承类中重新声明该函数,否则继承类仍为抽象类,程序无法编译通过;
2)派生类仅仅只是继承纯虚函数的接口,因此使用纯虚函数可以规范接口形式;
3)抽象类可以作为一种类型。可以使用指针或者引用指向它。