上書きされた問題

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);
まとめ:ベースクラスポインタは派生クラスオブジェクトを指し、永遠に派生クラスがベースクラスから継承したデータのアドレスを指す.