C++里的虚函数,纯虚函数,全纯虚函数,模版函数

149 阅读2分钟

1、虚函数(多态的体现)

我们在Java中已经学了Java的多态了,站在程序的角度来说,在程序运行的时候,才能确定的调用哪个函数,实例化哪个类,这就叫多态。属于静态多态的范畴。比如父类引用,指向子类实现。父类和接口的方法重写。我觉得方法重载也是多态的体现,他在编译期就已经知道了调用哪个方法,可以归为静态多态范畴。多态,字面意思理解更好理解,就是多个状态吧。子类就是父类的不同状态。方法的重载,就是这个方法的多个状态。
但是在C++中,是如何实现的呢?请看VCR,哦不对请看代码。

#include <iostream>
using namespace std;
class BaseActivity {
   public:
       void onCreate() {
           cout <<"BaseActivity" <<endl;
       }
};
class MainActivity:public BaseActivity{
public:
   //重新父类方法
   void onCreate() {
       cout <<"MainActivity" <<endl;
   }
};

void test (BaseActivity * base_activity_p) {
   base_activity_p->onCreate();
}

int main(int argc, char *argv[]) {
   BaseActivity *  main_activity =  new MainActivity();
   test(main_activity);
   if(main_activity) delete main_activity;
}

问题来喽,请问,它打印的是什么?它打印的是 BaseActivity,C++中默认是关闭多态的,开启多态,就需要将函数声明为虚函数。

class BaseActivity {
    public:
        virtual  void onCreate() {
            cout <<"BaseActivity" <<endl;
        }
};

这样我们打印出来的就是MainActivity了。

2、纯虚函数

在Java中我们有抽象类的概念,和抽象方法的概念,但是在C++中,它叫做纯虚函数。虚函数 指针指向 0,就是纯虚函数了。

image.png 这里有一点和Java不一样,子类继承了父类,父类的抽象方法是可以不重写的,但是在C++中,如果不重写父类的纯虚函数,则认为子类是抽象的。无法实例化。 所以我们要在子类中将父类所有的纯虚函数重写了。

class MainActivity:public BaseActivity{
    string getLayoutId() override {
        return  "R.layout.main_activity";
    }
};

类似抽象类的概念,都有了,那有没有接口呢?C++里没有接口,我们可以把纯虚函数当做接口来用。当一个类中只有纯虚函数时,被称为全纯虚函数,个比一个虚。

C++里没有抽象类,只是和抽象类类似。
C++里没有接口,只是和接口类似。

3、模版函数

类似Java里的泛型,C++里没有泛型,他叫模板函数。 定义一个模版,类型名称为TT,这样就可以像泛型一样,每次传递不同的类型了。

template  <typename TT>
void add(TT n1,TT n2) {
    return n1+n2;
}

void test() {
    add(1,1);
    add(1.0,1.0);
    add(1.0f,1.0f);
}