您的位置:首页 > 编程语言 > C语言/C++

c++多态,子类和父类方法的调用

2017-07-28 15:05 246 查看
#include <iostream>

using namespace std;

class A{

public:

    void run(){

        cout << "A : void run()" << endl;

    }

    virtual void run0(){

        cout << "A : void run0()" << endl;

    }

    A(){

        cout << "A()" << endl;

    }

    virtual ~A(){

        cout << "~A()" << endl;

    }

    A(const A &a){

        cout<< "A(const A &a)" << endl;

    }

};

class B:public A{

public:

    void run(){

        cout << "B:void run()" << endl;

    }

    void run0(){

        cout << "B: void run0()" << endl;

    }

    B(){

        cout << "B()" << endl;

    }

    ~B(){

        cout << " ~B()" << endl;

    }

    B(const B &b){

        cout<< "B(const B &b)" << endl;

    }

};

void fun(A &a){

    a.run();

}

void fun0(A a){

    a.run();

}

void fun1(A *a){

    a->run();

}

void rfun(A &a){

    a.run0();

}

void rfun0(A a){

    a.run0();

}

void rfun1(A *a){

    a->run0();

}

int main()

{

    A a;

    B b;

    a.run();  //父类方法

    b.run();  // 子类方法

    fun(a);   //父类方法

    fun(b);   //父类方法

    fun0(a);               // 值传递要先拷贝一份

    fun0(b);   //父类方法   // 值传递要先拷贝一份

    fun1(&a);

    fun1(&b);   //父类方法

    //发现问题:通过函数调用不了B的方法 

    //解决问题:需要将父类的方法加上virtual修饰

    cout << "************" << endl;

    a.run0();  //父类方法

    b.run0();  // 子类方法

    rfun(a);

    rfun(b);   //子类方法

    rfun0(a);               // 值传递要先拷贝一份

    rfun0(b);   //父类方法   // 值传递要先拷贝一份

    rfun1(&a);

    rfun1(&b);  //子类方法

    //发现问题:通过函数调用传参是对象的值的话,无法调用子类的方法

    //解决问题:尽量不要用值传递的方式

    A *p = new B;

    delete p;  //此时,调用不了B的析构器,需要将A的析构器加virtual修饰

    cout << "Hello world!" << endl;

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: