讓我再給予一個例子來說明我的問題:虛擬函數在繼承中表現怪異?
#include <iostream>
class PC
{
public:
PC():Data(0)
{
}
virtual void display()
{
std::cout<<"The data is :"<<Data<<std::endl;
}
protected:
int Data;
};
class SmartPC:private PC
{
public:
SmartPC():PC()
{
}
void convert()
{
PC* temp=static_cast<PC*>(this);
temp->display();
}
void display()
{
std::cout<<"The data is (in bb):"<<a<<std::endl;
}
};
int main()
{
SmartPC SmrtPC;
PC* miniPC= static_cast<PC*>(&SmrtPC);
SmrtPC.convert();
}
據斯科特邁爾斯:static_cast<PC*>(this);
將創建SmartPC的溫度基本副本。但temp->display();
執行派生類的display()
函數。爲什麼?它不應該執行基地的display()
的功能,因爲該對象現在完全是SmartPC的基礎的副本?
的另一個問題是,如果我在temp->data;
功能convert()
添加行,它說 PC::Data
是受保護的,但我從派生類範圍即SmartPC
訪問它,那麼爲什麼不工作?
任何幫助表示讚賞。
您可以提供一個引用Meyers說的地方嗎?也許你誤解了他。 –