レム例を与えることによって、私の問題を説明します。仮想関数は継承で変わっていますか?
#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()
を実行しました。どうしてこんなことに?オブジェクトが完全にSmartPCのベースのコピーになったので、ベースのdisplay()
の機能を実行するべきではありませんか?
もう一つの問題は、私がconvert()
機能で行temp->data;
を追加する場合、それは PC::Data
が保護されているが、私はSmartPC
すなわち、派生クラスの範囲からそれをアクセスしていますが、なぜそれが機能しないのですか?と言うことですか
何か助けていただければ幸いです。
マイヤーズの言葉を引用してください。おそらくあなたは彼を誤解したでしょう。 –