虚函数与抽象类

虚函数 
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;
为派生类提供一个一致的接口,纯虚函数的实现可以留给派生类来做
抽象类不能创建对象,如果派生类没有改写纯虚函数,那么其派生类仍然是抽象类

猜你喜欢

转载自blog.csdn.net/shidamowang/article/details/80085269
今日推荐