天天看点

C++中如何实现像Java中接口功能--C++抽象类(纯虚函数,虚函数)

在Java中定义个接口,之后可以定义不同的类来实现接口,如果有个函数的参数为这个接口的话,就可以对各自的类做出不同的响应。

如:

interface animal
{
    public void info();
}

class dog implements animal
{
    public void info()
    {
        System.out.println("dog class");
    }
}

class cat implements animal
{
    public void info()
    {
        System.out.println("cat class");
    }
}

class func{
    public void act(animal a)
    {
        a.info();
    }
}
public class test{
    public static void main(String []args)
    {
        dog d = new dog();
        cat c = new cat();

        func f = new func();
        f.act(d);
        f.act(c);

    }
}      

 而在C++中,没有接口的定义,我们可以定义抽象类来实现像Java中的接口功能。

包含纯虚函数的类就是抽象类不能实例化,纯虚函数可以定义为:(本文不考虑函数参数)

virtual type functionname()=0;

如:

#include <iostream>
using namespace std;
class animal
{
public:
    virtual void info()=0;
};
class dog:public animal
{
    void info()
    {
        cout << "dog class" << endl;
    }
};
class cat:public animal
{
    void info()
    {
        cout << "cat class" << endl;
    }
};
void test(animal &a)
{
    a.info();
}

int main()
{
    dog d;
    cat c;

    test(d);
    test(c);

    return 0;
}      

上述程序实现结果与Java中一样。

接口和抽象类都不能实例化,但是在C++中如果在类中只是声明为虚函数,还是可以进行实例化的,不严格地说,也是可以当做接口来用。

虚函数定义为:

virtual type functionname(){}

#include <iostream>
using namespace std;

class animal{
public:
    virtual void info(){
        cout<<"animal class."<<endl;
    }
};

class dog:public animal{
public:
    void info(){
        cout<<"dog class."<<endl;
    }
};

class cat:public animal{
public:
    void info(){
        cout<<"cat class."<<endl;
    }
};

void test(animal& a)
{
    a.info();
}


int main()
{
    animal a;
    dog d;
    cat c;

    test(a);
    test(d);
    test(c);

    return 0;
}      

在C++中定义虚函数是在函数前加个virtual关键字,上面例子的结果为:

C++中如何实现像Java中接口功能--C++抽象类(纯虚函数,虚函数)

如果在基类(animal)函数中没有加virtual关键字的话,就会输出:

C++中如何实现像Java中接口功能--C++抽象类(纯虚函数,虚函数)

 ps:看了很多东西,试着写点博客,欢迎批评指正,多给点建议。

转载于:https://www.cnblogs.com/mjk961/p/6442882.html