2012-03-28 7 views
0

これは世界でも最高のデザインではないかもしれませんが、実際の理由がなくても という回答に興味があります。新しい演算子と継承のオーバーロード

は私がオーバーロードされた新しい方法でこれら二つのクラスを持っていると仮定しましょう:

class Base { 
public: 
operator void* new(size_t); 
}; 

class Child : public Base { 
public: 
operator void* new(size_t); //THIS, i would like this to be the "original" new. 
}; 

operator void* Base::new(size_t) { 
//... 
return new Child; 
//... 
} 

私は子供:: newは、元の新しいのように動作したいと思いますので、私はmalloc関数の使用を避けることができます。

これを行う方法はありますか?

ありがとうございます!

+0

この[リンク](http://blogs.msdn.com/b/calvin_hsia/archive/2009/01/19/9341632.aspx)はあなたを助けるかもしれません... – niktehpui

+0

私はあなたの 'Base: :演算子newは '本当に '働いています(例えば' Child'が構築されるたびに破壊されません)。それを考えると、 'Child :: operator new'が何をしたいのかを言うのは難しいです。あなたはファクトリー機能を探していませんか? –

+0

グッドリード:[ISO C++標準に準拠したカスタムの新規および削除演算子はどのように書くべきですか?](http://stackoverflow.com/questions/7194127/how-should-i-write-iso-c-standard-conformant-custom -new-and-delete-operators)を使用します。私はあなたが達成しようとしているものを理解することができませんので、私は重複としてこれをマークすることを控え、私はあなたが探しているものだという気持ちがあります。 –

答えて

0

あなたは構文

return ::operator new(sizeof Child); 

を使用してグローバルoperator newに常にアクセスすることができますが単項スコープ演算子を注意してください。この構文は、クラスと名前空間のメンバーをすべて無視し、Base::operator newまたはChild::operator newのいずれかで機能します。

割り当て、初期化するオブジェクトをクラス/名前空間のメンバーを使用しなくても、それはさておき

::new Child 

を使用するには...はい、メンバーoperator newは通常、重大なコードのにおいです。

+0

'operator new'を呼び出すことをお勧めします。 –

+0

@ルクダントンええ、それを読んだ直後にそれをキャッチしました。心はまだ完全なスピードではありません。また、これは臭いです。 – Potatoswatter

+0

@Potatoswatter:ありがとう! :)これは私が欲しかったものです。これは本当に臭いものなので、私は他のリンクを見ていきます。 :) –

2

これは正しいデザインではありません。 operator new関数は、 生のメモリを返します。構築されたオブジェクトではありません。 の呼び出しで、new Baseの呼び出しが実際には新しいChildを作成することになる場合は、 をC++で実行することはできません。通常の解決方法は、ファクトリメソッドを Baseに提供することです。例えば:

class Base 
{ 
    // Ban the expression `new Base`... 
    void* operator new(size_t); 
protected: 
    virtual ~Base(); // Ban instances on the stack. 

public: 
    static Base* create(/*...*/); 
    // ... 
}; 

は、その後、ソースファイルに:

class Child : public Base 
{ 
    // ... 
}; 

Base* Base::create(/*...*/) 
{ 
    return ::new Child(/*...*/); 
} 

(1が常に::new Baseを書くことができますので、プライベートoperator newは完全に、new演算子を使用してからクライアントコード を禁止しないことに注意してください。)

operator newを直接割り当てを禁止する以外に、 唯一のメンバーはoperator newです。 s特定のプール からインスタンスを割り当てます。その場合は、プールに解放するためにメンバーoperator delete も必要です。

+0

ああ、私は参照してください。私はそれが何かを誤解しているように見えます。 –

関連する問題