24

以下のコードを参照してください。

a)この場合(単純な継承、仮想メンバーなし)、B :: df()の静的キャストには(何でも)オーバーヘッドがありますか?私は同様の質問に対するいくつかの矛盾する答えを見つけました、それが私が尋ねている理由です...

const M1 * funcb)キャストを避けるために、Aでプライベートにし、Bに新しいプライベートフィールドを導入することを考えていconst M2 * funcましたが、それは物事を複雑にし、スマートポインターの使用をより困難にします。キャストを避けるためのより良い方法がわかりますか?


class M1 {
public:
    double f() const;
};

class M2 : public M1 { public: double df() const; };

class A { protected: const M1 * func; public: A(const M1 * p); ~A(); double f() const; };

class B : public A { public: B(const M2 * p); double df() const; };


double M1::f() const { return 1973.0; }
double M2::df() const { return 0.0; }

A::~A() { delete func; } A::A(const M1 * p) : func(p) {} double A::f() const { return func->f(); }

B::B(const M2 * p) : A(p) {} double B::df() const { return static_cast<const M2*>(func)->df(); }

4

1 に答える 1

53

static_cast<T>(e)次の方法で発明された一時変数 v を作成することと同等です。

T v(e); //where T is an arbitrary type  and e is an arbitrary expression.

static_cast のランタイム コストは、上記のステートメントのコストとまったく同じです。

于 2011-06-22T20:08:29.277 に答える