0

このような2つのクラスがある場合:

class A
{
   public:
   virtual print(){};
   ~A(){print();}
};
class B:public A
{
   public:
   print(){};
   ~B(){}
};
void main()
{
  B *b1=new B;
  delete b1;
}

クラスAのデストラクタでは、クラスAのデストラクタにある場合、クラスBは技術的に破壊されるため、BからではなくクラスAからprintを呼び出しますか?

4

1 に答える 1

1

はい、そうです。クラスは、それ自体のデストラクタを呼び出してから、その親クラスのデストラクタを呼び出すことによって破壊されます。つまり、A を破壊するときには、B はすでになくなっています。構築時に基本クラスでオーバーライドされた仮想関数を呼び出すと、同様の動作が見られます。

一般に、コンストラクタまたはデストラクタで仮想関数を呼び出すことは悪い習慣と考えられています。これは、動作が明確に定義されていても、初心者に誤解を与える可能性があるためです。また、初心者でも簡単につまずきます。

于 2013-10-06T19:55:30.677 に答える