面接-毎日1題(11)


大丈夫、ブログを書く!自分の勉強の心得を記録する.いくつかの小さな細部の部分は、何気なく自分で無視されましたが、本当に使う時になって、本当に何が起こっているのか思い出せません.私はいつもこのような感じがします.
 
今日は、仮想構造関数の使用方法について説明します.
この面接問題はよくありますが、なぜ虚析構関数を使うのか教えてください.
実際のプログラミングでは、時には、本当にこの問題に注意しないこともありますが、時には注意して、なぜこの問題に注意しなければならないのか分かりません.クラスがベースクラスでない場合は、虚関数を使用するとプログラムのオーバーヘッドが増加するため、虚関数を使用する必要はありません.しかし,虚関数として整合性を維持するためには,虚関数を用いてサブクラスに自分の具体的な動作を定義させる必要がある.
だから基本的な1つは、理由もなく虚析構関数を宣言することは、永遠に宣言しないのと同じように間違っています.私たちはいつ声明するか、いつ声明しないかを知っています.
仮想構造関数について、C++言語標準はこの問題についてよく述べています.派生クラスのオブジェクトをベースクラスのポインタで削除し、ベースクラスに仮想構造関数がない場合、結果は確定できません.
 
構造関数をフィクション関数として定義するメリットは何ですか?
1.「構造関数」の役割はリソースを解放することであることを知っています.
2.架空の関数は「常に実際のオブジェクトを実行する」その関数を保証する
3.したがって、構造関数を虚関数として定義すると、オブジェクトが解放されることを常に保証するときに「自分を愛する関数」を呼び出すことができます.
4.構造関数を虚関数として定義するメリットは、「リソースの漏洩」を回避し、より安全にすることです.そのため、構造関数はいつも虚関数です.そうしないと、あちこちに気をつけなければなりません.
コード例のデモ:
#include <iostream>
using namespace std;

class A
{
public:
	A() {}
	~A() { cout<<"A destructor!
"; } }; class B:public A { public: B() {} ~B() { cout<<"B destructor!
"; } }; int main() { B *b = new B(); A *a = b; delete a; }

これは虚析构関数がないので、テストしてみましょう.
#include <iostream>
using namespace std;

class A
{
public:
	A() {}
	virtual ~A() { cout<<"A destructor!
"; } }; class B:public A { public: B() {} ~B() { cout<<"B destructor!
"; } }; int main() { B *b = new B(); A *a = b; delete a; }

虚析构関数バージョン~~~