1.“虚”
虚基类
虚函数
纯虚函数
1.1 虚基类
作用:当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。
怎样使用:
class a{};
class B:virtual public/private/protected a{};
class c:virtual public/private/protected a{};
1.2 虚函数
虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数.
作用:为了实现多态性,即通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。
这样不同的派生类接受同一消息(基类指针或引用访问派生类的覆盖成员函数)能够产生不同的反应(同名覆盖成员函数体内代码不同)
注意事项:1.构造函数、静态成员函数不能声明为虚函数
2.基类和派生类有同名函数时,如果参数一致,调用该函数时,优先调用,若想调用派生类的同名函数,需要设基类的同名函数为虚函数。
3.当派生类动态分配内存空间时,基类的析构函数应设为虚函数,这样删除基类的指针后会先调用派生类的析构函数,派生类的析构函数又自动调用基类的析构函数,从而整个派生类的对象完全被释放。
4.必须是基类的指针或者引用调用虚函数,这样才能访问对应派生类的虚函数,否则会调用基类本身的虚函数。
怎样使用:class a{
public:
virtual void set_value(){ 代码块1}
}
class b:public a
{
public:
void set_value(){代码块2}
}
class c:public a
{
public:
void set_value(){代码块3}
}
int main()
{
a * p[2];
p[0] = new b();
p[1] = new c();
p[0]->set_value();动态联编,执行代码块2
p[1]->set_value();动态联编,执行代码块3
return 0;
}
1.3 纯虚函数
作用:纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数(此时基类为抽象类,不能实例对象),它的实现留给该基类的派生类去做。
注意事项:1.抽象类虽然不能被实例化,但可声明抽象类的指针变量
怎么使用:class a
{
public:
virtual void set_value() = 0;
}
class b:public a
{
virtual set_value() //这里的virtual可加可不加
{
代码块1;
}
}
class c:public a
{
virtual set_value()
{
代码块2;
}
}