概要
C++的封装,继承,多态 是它三个重要的内容。 而其中多态的实现,就涉及到了虚函数。 有虚函数的出现就可以称之为多态,就有关键字virtual 修饰的函数。 如virtual void function();
而如果 virtual void function() = 0; 这种就称之为纯虚函数。 有纯虚函数的类,又叫做抽象类。
纯虚函数与普通虚函数写法上的最明显的是后面是否有“=0”, 而它的的特点是纯虚函数是不能在本类内写它的实现, 也就是子类继承时,必须写父类接口的实现。
而普通虚函数就是子类可以重写父类的虚函数。而且父类的指针可以指向子类对象。
而虚函数表是编译器为有virtual 修辞的函数新建的一张表, 开辟了一块对应的内存空间。
下面讲的主要是虚函数表的一些简单的实例:
单继承,无重写
class A {
virtual void a();
virtual void b();
};
class B : public A {
virtual void a1();
virtual void b1();
}
B *b;
//这种形势的,不涉及到重写,它的表现形势为
a b a1 b1
即为依次出现
单继承,有重写
class A {
virtual void a();
virtual void b();
};
class B : public A {
virtual void a();
virtual void b1();
};
B* b;
//它的表为
B::a() A::b B::b1
就是子类的重写函数在最前。
多继承,无重写
class A {
virtual void a();
virtual void b();
};
class B {
virtual void a1();
virtual void b1();
};
class C : public A, public B
{
virtual void a2();
virtual void b2();
};
C *c ;
A::a() , A::b(), C::a2() , C:: b2 第一张表;
B::a1(), B::b1() 第二张表
C::a2, C::b2 第三张表
多继承,有重写
class A {
virtual void a();
virtual void b();
};
class B {
virtual void a();
virtual void b1();
};
class C : public A, public B
{
virtual void a();
virtual void b2();
};
C *c ;
C::a() , A::b(), C::a2() , C:: b2 第一张表;
C::a(), B::b1() 第二张表
C::a, C::b2 第三张表