将基类转换为派生类的最佳解决方案是什么?



假设我们有一个包含基类的库,如下所示,

class Base{
protected:
int a;
public:
Base(int a) : a(a) {}
};
然后,我想在一个新的库中通过添加一个新函数来扩展它,就像下面的
class Derived : public Base{
public:
bool is_greater(Derived &y) { return a > y.a; }
};

因此,我们可以使用成员函数is_greater比较它们的成员值,作为

int main(){
Base b1, b2 = // get from the old library's output
Derived d1 = b1, d2 = b2 // convert from base class to derived class
d1.is_greater(d2);
}

所以,what's the best solution for this kind of conversion?,性能是我最关心的一点。

就像任何其他转换一样。您可以使用转换构造函数:

explicit Derived(const Base& base): Base(base) {}

转换操作符在这种情况下不是一个实用的选项,因为基类不知道派生类型。

扩展一个类来添加功能只有在以下情况下才可行

  1. 类被设计成这样扩展,多态与适当的api,或
  2. 你在任何地方使用你的扩展类,而不是基类。

…否则,没有办法避免具有潜在未定义行为的复制或危险的强制转换。

无论如何,我的观点是,等同于"扩展"。";inheritance"是一种由于滥用OOP而流行起来的代码气味。c++有自由函数。它是非侵入性的,允许您使用真正想要使用的类型和对象。此外,如果您很精明,该受保护的成员仍然可以访问:

bool is_greater(Base const& l, Base const& r) {
struct fetch : Base { using Base::a; };
return l.*(&fetch::a) > r.*(&fetch::a);
}

我们定义了一个继承自Base的局部类,是的。但是我们这样做并不是为了在错误类型的对象上捣乱。它所做的就是让我们可以访问成员。然后,我们简单地使用指针到成员语法,以一种定义良好的方式访问Base对象上的成员。

最新更新