См. Код ниже.
a) Имеет ли в этом случае (простое наследование, без виртуальных членов) статическое приведение в B :: df () какие-либо издержки (вообще)?Я нашел несколько противоречивых ответов на подобные вопросы, поэтому я спрашиваю ...
б) Я думал о том, чтобы сделать const M1 * func
частным в A и ввести новое частное поле const M2 * func
в B, чтобы избежатьприведение, но это отчасти усложняет ситуацию и затрудняет использование умных указателей.Вы видите лучший способ избежать броска?
<code>
class M1 {
public:
double f() const;
};</p>
<p>class M2 : public M1 {
public:
double df() const;
};</p>
<p>class A {
protected:
const M1 * func;
public:
A(const M1 * p);
~A();
double f() const;
};</p>
<p>class B : public A {
public:
B(const M2 * p);
double df() const;
};
<code>
double M1::f() const { return 1973.0; }
double M2::df() const { return 0.0; }</p>
<p>A::~A() { delete func; }
A::A(const M1 * p) : func(p) {}
double A::f() const { return func->f(); }</p>
<p>B::B(const M2 * p) : A(p) {}
double B::df() const { return static_cast<const M2*>(func)->df(); }