c++ 是一种面相对象的语言,其核心主要是表现在c++语言的多态上,简单的概括为“一个接口,多种形态”。多态的特性是通过虚函数来实现的。虚函数允许子类重写父类的函数,只有重写了虚函数才能体现c++ 的多态特性。一般的子类可以重载父类的成员函数,这些重载的函数 允许多个同名函数,函数的参数列表不同,参数的个数不同,参数类型不同。编译器会根据这些函数的参数列表,参数类型,参数个数,等生成一些不同名字的预处理函数。来实现同名函数的调用重载。但是没有体现c++ 的多态特性。
c++的多态特性主要是体现在,函数的地址是早绑定还是晚绑定,如果函数调用在编译器编译时,就可以确定函数的调用地址,那么就是早绑定,如果函数的调用地址不能再编译期间确定,需要在运行时才能确定,这就属于晚绑定。
下面看一个简单的例子:
#include <iostream>
#include <string>
using namespace std;
class Base
{
public:
void func1()
{
cout << " Base func1 1" << endl;
}
virtual void func2()
{
cout << " Base func2 2 " << endl;
}
};
class CTest : public Base
{
public:
void func1()
{
cout << " CTest func1 1" << endl;
}
void func2()
{
cout << "CTest func2 2" << endl;
}
};
int main()
{
Base a;
CTest b;
Base* p = &a;
p->func1(); // Base func1 1
p->func2(); // Base func2 2
p = &b;
p->func1(); // Base func1 1
p->func2(); // CTest func2 2
return 0;
}
运行的结果如下:
由上面的结果可以看到,基类指针p 在第二次指向CTest对象时候,运行p->func2() 函数时,体现出多态特性,此时调用的是子类CTest中的方法,而不是基类中的func2()。
纯虚函数和虚函数:
1.纯虚函数是在基类中声明的虚函数,在基类中没有任何的定义,但是要求在任何的派生类中需要自己实现这个自己的方法。原型一般是: virtual void function() =0;
2.纯虚基类 也叫做抽象类 不能实例化,不能生成对象,。
3.虚函数在基类中被声明为virtual,在派生类中,各自实现自己的函数,可实现运行时多态。