• 虚函数virtual ReturnType Function(){}
  • 纯虚函数virtual ReturnType Function()=0;

虚函数与纯虚函数的区别

  • 声明虚函数,可以定义,也可以不定义,含有虚函数的类,可以被实现。
  • 声明纯虚函数,不可以有定义,含有纯虚函数的类(等价于抽象类),不可以被实现。

虚函数表

虚函数表是C++实现动态绑定技术(多态)的背后依赖。每个包含虚函数的类都包含一个虚表,同一个类的多个对象共享同一个虚表,也就是说每个对象前8个字节用来存储一个指针,同一类的多个对象的该指针相同,都指向该类的虚表。而虚表的构造在编译阶段就已经确定下来了。

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
class A
{
public:
virtual void func1()
{
cout<<"A::func1() is called"<<endl;
}
virtual void func2()
{
cout<<"A::func2() is called"<<endl;
}
private:
int data1;
};
class B:public A
{
public:
void func1()
{
cout<<"B::func1() is called"<<endl;
}
private:
int data2;
};
int main()
{
A *a = new B();
a->func1(); // B::func1() is called
return 0;
}

所以当调用a->func1()的时候,尽管a是类A的指针,但是仍然访问到对象对应的虚表,而*a对应的对象是BB的虚表中func1指向的是B::func1,所以最后访问到的是B::func1