簡體   English   中英

將指向基礎對象的指針轉換為派生類的指針

[英]converting pointer to base object into pointer of derivate class

我一直對將基類對象的指針轉換為派生類的指針感到困惑。 請檢查以下代碼:

derivate_class *d1 = (derivate_class*)cb;
d1->print();
d1->print1();

結果是:

  • 我是基地的虛擬功能。
  • 我是派生類的一個函數。
  • 任何人都可以幫我解釋為什么d1->print()打印“我是基礎中的虛函數。”?

    #include <iostream>
    using namespace std;
    
    class base
    {
    public:
        virtual void print()
        {
            cout << "I'm a virtual function in base." << endl;
        }
    };
    
    class derivate_class : public  base
    {
    public:
        void print()
        {
            cout << "I rewrite the virtual function in base." << endl;
        }
    
        void print1()
        {   
            cout << "I'm a function in derivate class." << endl;
        }
    };
    
    int main()
    {
        base* b = new base();
        derivate_class *d = new derivate_class();
        b->print();
        d->print1();
        base* cb = b;
        b = d;
        b->print();
        cout << "*********************" << endl;
    
        derivate_class *d1 = (derivate_class*)cb;
        d1->print();
        d1->print1();
    
        system("pause");
        return 0; 
    }
    

    它是UB,所以任何事情都可能發生。

    但這里有一個解釋: d1實際上並沒有指向一個derivate_class ,而是指向一個base

    base* b = new base();
    //...
    base* cb = b;
    derivate_class *d1 = (derivate_class*)cb;
    d1->print();
    d1->print1();
    

    調用是動態解決的,因為它是通過指針而方法是virtual

    print1不是virtual因此靜態解析了調用。 但是printvirtual ,因此調用大多數派生類型的實現。 但在這種情況下,派生最多的類型實際上是base

    在引擎蓋下,在虛擬函數表中查找cb指向的vfptr的方法print 由於cv是一個base ,該表將是的base ,它包含了功能printbase::print的實現。 這就是為什么這個函數被調用了。

    d1是一個derivate_class指針,但它實際指向的數據(cb)是base類型。 由於print()是虛擬的,因此動態解析調用,因此它將在虛函數表中找到base的實現而不是derivate_class。

    暫無
    暫無

    聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

     
    粵ICP備18138465號  © 2020-2024 STACKOOM.COM