次のようなクラスがあります。
class Foo
{
public:
Foo();
virtual ~Foo();
private:
Odp* bar;
};
に初期化bar
したいNULL
。これはそれを行うための最良の方法ですか?
Foo::Foo() : bar(NULL)
{
}
また、デストラクタは仮想である必要がありますか?(それが本当なら、コンストラクターも仮想でなければなりませんか?)
次のようなクラスがあります。
class Foo
{
public:
Foo();
virtual ~Foo();
private:
Odp* bar;
};
に初期化bar
したいNULL
。これはそれを行うための最良の方法ですか?
Foo::Foo() : bar(NULL)
{
}
また、デストラクタは仮想である必要がありますか?(それが本当なら、コンストラクターも仮想でなければなりませんか?)
に初期化
bar
したいNULL
。これはそれを行うための最良の方法ですか?
それが正しい方法です。あ、はい。
また、デストラクタは仮想である必要がありますか?
いいえ。デストラクタは、Foo
クラスから継承し、Foo
ポインタを使用してそれらの派生クラスを削除する場合にのみ仮想である必要があります(ただし、一般的な経験則として、他の仮想メンバーがある場合は仮想である必要があります)。
(それが本当なら、コンストラクターも仮想でなければなりませんか?)
いいえ。コンストラクターはそうである必要はありませんし、そうである必要もありvirtual
ません。
はい、イニシャライザリストが最適です。
多分。クラス内に他の仮想関数を含める場合、またはクラスを継承する場合(通常はこれらが一緒になりますが)、デストラクタは仮想である必要があります。
いいえ。C++で仮想コンストラクターを使用することはできません。(そのようなことはどういう意味ですか?)
virtual
あなたの質問の性質は、あなたがキーワードが何をするのか、または何のためにあるのかを本当に理解しておらず、他の場所やチュートリアルで見たものをコピーしているだけだと私に示唆しています。作成しているすべてのコードの目的を理解するのが最善です。ここから始めることができます:http://www.parashift.com/c++-faq-lite/virtual-functions.html
4つの異なる方法があります。どれが一番いいかはあなた次第です
Foo::Foo() : bar() // value initialization
{
}
Foo::Foo() : bar(0) // direct null pointer constant
{
}
Foo::Foo() : bar(NULL) // null pointer constant by macro
{
}
Foo::Foo() : bar(nullptr) // pointer literal of type std::nullptr_t
{
}
検討したいもう1つのオプションは、生のポインターの代わりにスマートポインタークラス(、、またはC ++ 0xなど)boost::scoped_ptr
をboost::shared_ptr
使用することです。unique_ptr
スマートポインタのコンストラクタは、他の明示的な初期化が必要ない場合のように、NULLに初期化されていることを確認します。スマートポインタは、ポイントされたオブジェクトが破棄されることも保証します。
アイテムに適切なスマートポイントポリシーの種類を決定し、それに応じて選択する必要があります(auto_ptr
さまざまな落とし穴を認識している限り、生のポインターよりも優れている可能性があります)。
1、はい
2、誰かがあなたのクラスから派生し、基本クラスへのポインタを使用できるようにしたい場合のみ-しかし、とにかくdtorを仮想化します
3、いいえ、仮想ctorを持つことはできません(または、すべてのctorは仮想であると思いますか?)
Virtual functions are to determine which function of class (which is defined in both base and derived class) must be called during run time. But when object is created compiler knows which constructor is to be called. for eg. when base object is created base constructor is calledand same for the derived class. Hence making constructor to be virtual doesnt makes any sense.But once when the base class object pointer points to the derived class object, and then destructor is called ,compiler gets confused which destructor(either of baseor derived) needs to be called, which is can only resolved using lookup table vtable and hence destructor needs to be virtual.