![](/img/trans.png)
[英]Pointer to derivate class member function from pointer to base class member function
[英]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
因此靜態解析了調用。 但是print
是virtual
,因此調用大多數派生類型的實現。 但在這種情況下,派生最多的類型實際上是base
。
在引擎蓋下,在虛擬函數表中查找cb
指向的vfptr的方法print
。 由於cv
是一個base
,該表將是的base
,它包含了功能print
與base::print
的實現。 這就是為什么這個函數被調用了。
d1是一個derivate_class指針,但它實際指向的數據(cb)是base類型。 由於print()是虛擬的,因此動態解析調用,因此它將在虛函數表中找到base的實現而不是derivate_class。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.