覆盖 Coverage
在基类中定义了一个非虚拟函数,然后在派生类中又定义了一个同名同参数同返回类型的函数,既是覆盖
在派生类对象上直接调用这个函数名,则只会调用派生类中的同名函数
#include <iostream>
using namespace std;
class A
{
public:
void ShowMessage();
};
class B: public A
{
public:
void ShowMessage();
};
void A :: ShowMessage()
{
cout << "This is A." << endl;
return;
}
void B :: ShowMessage()
{
cout << "This is B." << endl;
return;
}
int main()
{
A* p;
B q;
*p = q;
p -> ShowMessage();
q.ShowMessage();
return 0;
}
输出
This is A.
This is B.
重载 Reload
在同一个作用域内,当有两个或多个函数名相同的函数,但是函数的形参列表(指参数的个数、类型或者顺序)不同
在调用相同函数名的函数时,根据形参列表确定到底该调用哪一个函数
#include <iostream>
using namespace std;
class A
{
public:
void ShowMessage();
void ShowMessage(string str);
};
void A :: ShowMessage()
{
cout << "This is A." << endl;
return;
}
void A :: ShowMessage(string str)
{
cout << str << endl;
return;
}
int main()
{
A p;
p.ShowMessage();
p.ShowMessage("How are you?");
return 0;
}
输出
This is A.
How are you?
多态 Polymorphism
多态按字面的意思就是多种形态,是上述中唯一采用动态绑定技术的一种情况
当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态
在基类中定义了一个虚拟函数,然后在派生类中又定义一个同名同参数表的函数,即是多态
调用哪个函数并不由函数的参数表决定,而是会根据调用函数的对象类型来执行不同的函数:
如果对象是基类对象,则会调用基类中的函数;
如果对象是派生类对象,则会调用派生类中的函数
形成多态必须具备三个条件:
必须存在继承关系;
继承关系必须有同名虚函数;
存在基类类型的指针或者引用,通过该指针或引用调用虚函数
#include <iostream>
using namespace std;
class A
{
public:
virtual void ShowMessage();
};
class B: public A
{
public:
void ShowMessage();
};
void A :: ShowMessage()
{
cout << "This is A." << endl;
return;
}
void B :: ShowMessage()
{
cout << "This is B." << endl;
return;
}
int main()
{
A* p;
p = new A();
p -> ShowMessage();
p = new B();
p -> ShowMessage();
return 0;
}
输出
This is A.
This is B.
虚函数
虚函数是在基类中使用关键字 virtual 声明的函数
在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接
纯虚函数
在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象
如果不想在基类中对虚函数给出有意义的实现,这个时候就会用到纯虚函数
class A
{
public:
// pure virtual function
virtual void ShowMessage() = 0;
};
“= 0”告诉编译器,函数没有主体,上面的虚函数则是纯虚函数
References
[1] C++覆盖、重载、多态区别
[2] C++ 重载运算符和重载函数
[3] C++ 多态
希望能够对大家有所帮助~