C++多态学习之向下强制类型转换

向下强制类型转换

在C++中,基类(父类)指针可以指向派生类(子类)对象,因为派生类对象也是一个基类对象(但反过来不一样,基类对象不是一个派生类对象)。然而基类指针只能调用基类的成员函数,如果试图使用该指针调用仅在派生类中含有的成员函数(子类特有的,不是继承和重写父类的函数),将会产生编译错误。为了避免这一错误,就必须将基类指针转换成为派生类指针。《C++大学教程第13章,面向对象编程:多态性》

如何进行向下强制类型转换

在C++使用 dynamic_cast 关键字进行向下强制类型转换,代码如下所示:

class Base{//基类
public:
    Base(){}//构造函数
    virtual void print()const{//虚函数print
        cout << "父类的print函数"<< endl;
    }

};

class A:public Base{//子类A
public:
    A(){}//构造函数
    virtual void print()const{//
        cout << "子类A的print函数" << endl;
    }
};

class B:public Base{//子类B
public:
    B(){}//构造函数
    virtual void print()const{//
        cout << "子类B的print函数" << endl;
    }
};

int main(){
    Base *pbase = nullptr;
    A a, *pa = nullptr;
    B b, *pb = nullptr;

    pbase = &a;//基类指针指向子类A对象
    cout << "pbase是基类指针,但是指向的是子类A的对象" << endl;
    pbase->print();//基类指针调用虚函数print,多态,将调用子类A的print

    cout << endl <<"pbase是基类Base类型的指针\n" << "我们将其转换为子类A的指针:" ;
    pa = dynamic_cast< A* >(pbase);
    //向下强制类型转换,本来pbase指向的是子类A的对象,因此,该转换是成功的
    if(nullptr != pa){
        cout << "向下强制转换成功" << endl;
    }else{
        cout << "向下强制转换失败" << endl;
    }

    cout << "\n现在我们将其转换为子类B的指针:";
    pb = dynamic_cast< B* >(pbase);
    //此时pbase还是指向子类A的对象,我们让pbase强制转换成子类B的对象,转失败
    if(nullptr != pb){
        cout << "向下强制转换成功" << endl;
    }else{
        cout << "向下强制转换失败" << endl;
    }

    //pbase = &b;
   // pbase->print();//调用子类B的print函数

    return 0;
}

运行结果如下:

在进行强制类型转换后一般需要判断强制转换是否成功,然后在接着执行进一步操作。

posted @ 2019-03-14 13:29  木子苍苍  阅读(1682)  评论(0编辑  收藏  举报