请查看下面的代码。
a) 在这种情况下(简单继承,没有虚成员),B::df()中的static_cast是否有任何开销(无论如何)? 我发现类似问题的答案有些矛盾,这就是为什么我在问这个问题...
b) 我正在考虑将A中的const M1 * func
设置为私有,并引入一个新的私有字段const M2 * func
到B中以避免转换,但这会使事情变得复杂并使智能指针的使用更加困难。 你能想到更好的避免转换的方法吗?
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(); }