C++クラスの解析関数呼び出しと虚解析関数


構造関数は一般的に自動的に呼び出されますが、場合によっては、アウトスタックやインスタック操作などの明示的な呼び出しが必要になります.
void C::push_back(const X& a)
{
// ...
new(p) X{a}; // copy constr uct an X with the value a in address p
// ...
}

 
void C::pop_back()
{
// ...
p−>˜X(); // destroy the X in address p
}

クラスを作成することもできます.明示的に構造関数を呼び出すだけで、次のように暗黙的に呼び出すことはできません.
class Nonlocal {
public:
// ...
void destroy() { this−>˜Nonlocal(); } // explicit destruction
private:
// ...
˜Nonlocal(); //don’t destroy implicitly
};
void user()
{
Nonlocal x; // error : cannot destroy a Nonlocal
X∗ p = new Nonlocal; // OK
// ...
delete p; // error : cannot destroy a Nonlocal
p.destroy(); //OK
}

このとき,構造関数は私有化され,外部から呼び出されない.公有関数destroy()のみ呼び出すことができます.
 
仮想構造関数とは、仮想関数の前にvirtualキーワードを追加することであり、通常は他の仮想関数のあるクラスで使用されます.
class Shape {
public:
// ...
virtual void draw() = 0;
virtual ˜Shape();
};
class Circle {
public:
// ...
void draw();
˜Circle(); // overrides ˜Shape()
// ...
};

ダミー構造関数の役割は、継承時に正しい構造関数を呼び出してリソースを正しく解放することです.
次のShape*pは、派生クラスのグループとしてのインタフェースとして考えられ、p->draw()を呼び出すと、Circle,triangleなどの適切な派生クラスが呼び出されます.
この場合,構造関数を呼び出す際にも虚関数メカニズムを用いて,適切な虚関数を呼び出し,適切なリソースを解放する必要がある.
void user(Shape∗*p)
{
p−>draw(); // invoke the appropriate draw()
// ...
delete p; // invoke the appropriate destructor
};

いくつかの本、例えばお金のC++プログラムの設計はいくつかの問題を話して本当に分かりにくいです.あまり回りくどいことを言っているので,深く見る必要はない.あまり上手ではないし、実用的でもないからです.
実際には、すべてのベースクラスの構造関数が虚構造関数として定義されていることを覚えています.virtualを追加します.問題は解決した.