关于基类与派生类指针的转换问题

2019-06-14  本文已影响0人  github_lincy

派生类指针强转基类指针

向上转换简单无门槛,直接通过dynamic_cast转换,见代码示例。

基类指针强转派生类指针

向下转换要求基类得有虚函数,否则编译时会报cannot dynamic_cast ‘qa’ (of type ‘class A’) to type ‘class C’ (source type is not polymorphic) 错误,见代码示例。

代码示例

#include <iostream>
#include <string>

using namespace std;

class A {
public:
    A() {};
    virtual ~A() {};
public:
    void funa() {
        cout << "hi Aobj" << endl;
    }
};

class B: public A {
public:
    B() {};
    ~B() {};
public:
    void funb() {
        cout << "hi Bobj" << endl;
    }
};

class C: public B {
public:
    C() {};
    ~C() {};
public:
    void func() {
        cout << "hi Cobj" << endl;
    }
};

int main()
{
    cout<< "派生类指针强转基类指针 example" <<endl;
    C *pc = new C;
    /**< 派生类指针强转基类指针 */
    A *pa = dynamic_cast<A*> (pc);
    B *pb = dynamic_cast<B*> (pc);
    pa->funa();
    pb->funb();
    
    cout<< "\n基类指针强转派生类指针 example" <<endl;
    A *qa = new C;
    /**< 基类指针强转派生类指针,注:基类需有虚函数,否则会报错 */
    B *qb = dynamic_cast<B*> (qa);
    C *qc = dynamic_cast<C*> (qa);
    qa->funa();
    qb->funb();
    qc->func();
}

上一篇 下一篇

猜你喜欢

热点阅读