1
    #include <iostream>
    #include <cstdlib>
    #include <string.h>

    using namespace std;

    class A {
            public:
            A () {cout<<" A\n";}
            virtual ~A () {cout<<" ~A\n";}
            };

    class B : public A {
            public:
            B () :A() {cout<<" B\n";}
            virtual ~B() {cout<<" ~B\n";}
            };

    int main (int, char *[]) {
            A *ap = new B;
            delete ap;
            A b = *ap;
            return 0;
            }

出力は次のとおりです。

  A

  B

 ~B

 ~A

A の最後のデストラクタが A に対して呼び出されるのはなぜですか b = *ap A のコンストラクタがここで呼び出されないのはなぜですか?

ありがとう !!!

4

1 に答える 1

5

未定義の動作に遭遇しており、何かが起こる可能性があります。

呼び出した後、delete ap;それを逆参照することは違法です:

delete ap;
A b = *ap;

それはさておき、デストラクタが継承の逆順で呼び出されることは知っていますよね? つまり、 a を削除するBと、基本クラスのデストラクタ~Aも呼び出されます。

また、有効な場合 (そうでない場合)、コンストラクターではなくA b = *ap;、コンパイラーによって生成されたcopy-constructorを呼び出すことに注意してください。

于 2012-06-12T09:24:19.630 に答える