上書きされた問題
1386 ワード
#include
using namespace std;
class Base
{
private :
int ma;
public:
void show(){cout<<"ma="<public Base
{
private :
int mb;
public:
void virtual show(){cout<<"mb="<int main()
{
Base*p = new (nothrow)Derive;
p->show();
return 0;
}
このコードは実行できますか?なぜ、どのようにして実行させることができますか?
答え:まず、このコードの実行は通過しません.派生クラスには虚関数があるため、派生クラスのオブジェクトメモリはvfptr base::ma mbはvfptr(虚関数テーブルポインタ)を多く生成し、派生クラスはベースクラスのポインタpを継承し、ベースクラスのオブジェクトメモリはmaであり、虚関数テーブルポインタはない.従ってpは、実際のメモリの開始アドレスではなく、開始アドレスに基づいて+4を指す.deleteがエラーである場合.
int q=(int)pに変更すべきである.delete (q-1);
まとめ:ベースクラスポインタは派生クラスオブジェクトを指し、永遠に派生クラスがベースクラスから継承したデータのアドレスを指す.