虚函数
1, 虚函数是非静态的、非内联的成员函数,而不能是友元函数,但虚函数可以在另一个类中被声明为 友元函数。
2, 虚函数声明只能出现在类定义的函数原型声明中,而不能在成员函数的函数体实现的时候声明。
3, 一个虚函数无论被公有继承多少次,它仍然保持其虚函数的特性。
4, 若类中一个成员函数被说明为虚函数,则该成员函数在派生类中可能有不同的实现。
当使用该成员函数操作指针或引用所标识的对象时 ,对该成员函数调用可采用动态联编。
5, 定义了虚函数后,程序中声明的指向基类的指针就可以指向其派生类。在执行过程中,该函数可以 不断改变它,在派生类中重新定义虚函数时,virtual可写可不写
6 只有protected,public成员才能被声明为虚函数
编译器在发现虚函数时,会为每个包含虚函数的类创建一个虚表,是一个一维数组,用来存放每个虚函数的地址
是带有纯虚函数的类,为了通过抽象类多态使用其中的成员函数
纯虚函数 - virtual void set() = 0;
为派生类提供一个一致的接口,纯虚函数的实现可以留给派生类来做
抽象类不能创建对象,如果派生类没有改写纯虚函数,那么其派生类仍然是抽象类
1, 虚函数是非静态的、非内联的成员函数,而不能是友元函数,但虚函数可以在另一个类中被声明为 友元函数。
2, 虚函数声明只能出现在类定义的函数原型声明中,而不能在成员函数的函数体实现的时候声明。
3, 一个虚函数无论被公有继承多少次,它仍然保持其虚函数的特性。
4, 若类中一个成员函数被说明为虚函数,则该成员函数在派生类中可能有不同的实现。
当使用该成员函数操作指针或引用所标识的对象时 ,对该成员函数调用可采用动态联编。
5, 定义了虚函数后,程序中声明的指向基类的指针就可以指向其派生类。在执行过程中,该函数可以 不断改变它,在派生类中重新定义虚函数时,virtual可写可不写
6 只有protected,public成员才能被声明为虚函数
编译器在发现虚函数时,会为每个包含虚函数的类创建一个虚表,是一个一维数组,用来存放每个虚函数的地址
class a
{
public:
void fo()
{cout << "a->fo" << endl;}
}
class b:a
{
public:
void fo()
{cout << "b->fo" << endl;}
}
int main()
{
a *m;
a t;
b k;
m = &t;
cout << m.fo() << endl; // output1
m = &k;
cout << m.fo() << endl; //output2
}
此时两种输出都是"a->fo"
如果把基类的fo函数设置为虚函数,virtual void fo(){cout << "a->fo" << endl;}
那么输出就会变为 a->fo 和 b->fo
抽象类:
是带有纯虚函数的类,为了通过抽象类多态使用其中的成员函数
纯虚函数 - virtual void set() = 0;
为派生类提供一个一致的接口,纯虚函数的实现可以留给派生类来做
抽象类不能创建对象,如果派生类没有改写纯虚函数,那么其派生类仍然是抽象类