本质区别就是: (虚函数)重写会改变父类的方法,而(非虚函数)覆盖则不会。
没理解可以看如下代码:
class A
{
public:
virtual string GetName_1() //虚函数
{
return "A_Class";
}
string GetName_2() //非虚函数
{
return "A_Class";
}
};
class B : public A
{
public:
string GetName_1() //重写A类中的函数
{
return "B_Class";
}
string GetName_2() //覆盖A类中的函数(只有对B类有效,因为A中该函数不是虚函数)
{
return "B_Class";
}
};
下面看输出:
//情况一:
A *a = new A();
cout<< a->GetName_1(); //直接调用,输出“A_Class”
cout<< a->GetName_2(); //直接调用,输出“A_Class”
//情况二:
A *b = new B(); //!!!注意:指针类型为A*
cout<< b->GetName_1(); //GetName_1被重写,输出“B_Class”
cout<< b->GetName_2(); //GetName_2函数无法被覆盖,输出“A_Class”
//情况三:
B *b = new B(); //指针类型为B*
cout<< b->GetName_1(); //直接调用,输出“B_Class”
cout<< b->GetName_2(); //GetName_2函数被覆盖,输出“B_Class”