C++ 虚函数

虚函数定义

虚函数是用关键字virtual修饰的某基类中的 protected或public成员函数。它可以在派生类中 重新定义,以形成不同版本。只有在程序的执 行过程中,依据指针具体指向哪个类对象,或 依据引用哪个类对象,才能确定激活哪一个版 本,实现动态关联

可以在程序运行时通过调用相同的函数名而实现不同功能的函数称为虚函数

虚函数的声明与特点

1
virtual FuncName(参数列表);

一旦把基类的成员函数定义为虚函数,由基类 所派生出来的所有派生类中,该函数均保持虚函数的特性 在派生类中重新定义基类中的虚函数时,可以不用关键字virtual来修饰这个成员函数

虚函数实例

虚函数实现动态多态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
class A{ 
	protected: 
		int x; 
	public: 
	A(){
		x =1000;
	} 
	virtual void print(){ //虚函数 
		cout << "x=" << x << endl ;
	}
};
class B:public A{
		int y; 
	public: 
		B() {
			y=2000;
		} 
		void print() { //派生虚函数 
		 cout << "y=" << y << endl ;
		 }
};

class C:public A{ 
	int z; 
	public: 
		C(){
			z=3000;
		} 
		void print(){ //派生虚函数 
		cout << "z=" << z << endl ;
		}
};

void main(void ) {
	A a, *pa; 
	B b;
	 C c;
	  a.print(); b.print(); c.print(); //以上为静态关联
	  pa=&a; pa->print(); //调用类A的虚函数 
	  pa=&b; pa->print(); //调用类B的虚函数 
	  pa=&c; pa->print();//调用类C的虚函数
}

纯虚函数

在基类中不对虚函数给出有意义的实现,它只是在派生类中有具体的意义。这时基类中的虚函数只是一个入口,具体的目的地由不同的派生类中的对象决定。 这个虚函数称为纯虚函数。 包含纯虚函数的类为抽象类。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // pure virtual function
      virtual int area() = 0;
};

virtual int area() = 0告诉编译器,函数没有主体,上面的虚函数是纯虚函数

虚函数使用注意事项

  1. 当在基类中把成员函数定义为虚函数后, 在其派生类中定义的虚函数必须与基类中的虚函数 同名,参数的类型、顺序、数量必须一一 对应,函数的返回的类型也相同

若函数名相同,但参数的个数不同或者参数的类型不同时,则属于函数的重载,而不是虚函数。 若函数名不同,显然这是不同的成员函数

  1. 实现这种动态的多态性时,必须使用 基类 类型的指针变量,并使该指针指向不同的派生类 对象,并通过调用指针所指向的虚函数才能实现动态的多态性 ,即在程序运行时,通过赋值语句实现多态性

  2. 虚函数必须是类的一个成员函数,不能是 友元函数,也不能是 静态成员函数 (所有对象共有, 无法重新定义)

  3. 可把析构函数定义为虚函数,但是,不能将 构造函数定义为虚函数

  4. 一个函数如果被定义成虚函数,则不管经历 多少次派生,仍将保持其虚特性,以实现“一个 接口,多个形态”

  5. 虚函数与一般的成员函数相比较,调用时的 执行速度要慢一些。为了实现多态性,在每一 个派生类中均要保存相应虚函数的入口地址表, 函数的调用机制也是间接实现的。因此,除了 要编写一些通用的程序,并一定要使用虚函数 才能完成其功能要求外,通常不必使用虚函数

experience
使用 Hugo 构建
主题 StackJimmy 设计