static_cast编译器从派生引用到基准引用的错误

时间:2013-06-26 02:52:57

标签: c++ inheritance g++ operator-overloading static-cast

在我发布的最近一个问题(C++: Bad Form to Call Base Class Asssignment Operator in Derived Class Constructor?)的评论中,关于如何使用static_cast从派生类型转换为基本类型,我遇到了另一个问题。有关该问题的支持文档,请访问:Why does static_cast(*this) to a base class create a temporary copy?

我的主要问题是我现在没有使用static_cast将其强制转换为派生类中的基类。但是,我无法从派生引用执行静态强制转换。我只在派生类的相等运算符中执行此操作。这是问题所在:

bool Derived::operator==(const Derived& other_derived) {
  // first call the operator == from the base class...
  if (static_cast<Base&>(*this) == static_cast<Base&>(other_derived)) {
    // continue checks for derived member variables
  }
}

编译器在上面的if语句中大喊。 static_cast对此没有任何问题,但无法将派生类中的static_cast解释为基类。如果删除引用,则编译很好,但如两个引用的问题所示,这将不必要地创建一个临时对象。

结果,我想知道是否我错过了从派生类到基类的构造函数。我会在哪里编写这样的构造函数(因为它是基类型的构造函数)?我认为在基础源代码中这样做是没有意义的,因为这本质上不会使基类自定义并破坏可重用代码的精神吗?

更简单的替代方法是接受在此函数中临时创建对象,但该函数可能最终被频繁调用,因此我不确定是否可以接受性能损失。

我还应该考虑其他任何我想念的东西吗?一如既往,感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

所有功劳都归功于@jogojapan。派生类和基类中的operator ==从未定义/声明为const。将所有相等和不等式运算符更改为const函数会产生程序编译。此外,我不得不稍微改变static_cast synatax以转换为const类型。那就是:

static_case<const Base&>(derived_object);

再次感谢您的帮助!