以下のコードを参照してください。
a)この場合(単純な継承、仮想メンバーなし)、B :: df()の静的キャストには(何でも)オーバーヘッドがありますか?私は同様の質問に対するいくつかの矛盾する答えを見つけました、それが私が尋ねている理由です...
const M1 * func
b)キャストを避けるために、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(); }