相同点:
1、都可以在子类中重新实现,以便实现多态。
不同点:
1、虚函数在父类中必须定义(一般是空定义),所以子类可以实现虚函数,也可以不实现,如果实现虚函数了,即覆盖了父类的虚函数,同时也继承了父类的虚函数,使用父类的虚函数要指明父类的对象!
2、纯虚函数在父类中只是声明,不可以实现,用于统一接口,所以所有的子类必须实现父类的纯虚函数。
3、带有纯虚函数的父类(也叫作抽象类),不可以new 对象,但可以声明对象,声明对象用来实现多态。
4、带有虚函数,但没有纯虚函数的父类,可以new对象,当然也可以声明对象。
示例:
1、虚函数:
class A
{
public:
virtual void hello(){} //虚函数,空定义,意味着在子类重新实现,如果不是空定义,意味着子类也继承该方法,可以用在子类中。虚函数在子类重新实现后,本身还是虚函数。
}
class B:public class A
{
public:
void hello(){...............}// 重新实现class A的虚函数 hello函数,class B的hello函数还是虚函数!!!
}
class C:public A
{
public:
void world();//没有重现实现class A中的虚函数hello函数,但也继承了 class A中的函数hello,但是由于其是空定义,所以对于class B来说,没有意义,如果不为空,class B就可以利用class A的hello函数。
}
2、纯虚函数
class D
{
public:
virtual void hello() = 0;//注意要加上 = 0,这是纯虚函数的标志!!
}
class E:public D
{
public:
void hello();//必须实现父类的纯虚函数!!!
}
class F:class D
{
public :
void hello();//必须实现父类的纯虚函数!!!
}