C++ 运算符重载显示输出中的不规则行为 #包括 使用名称空间std; 阶级基础 { 公众: 虚拟布尔运算符==(常量基和其他)=0; }; 派生类:公共基 { 公众: 布尔运算符==(常量基和其他){return false;} 布尔运算符==(常量派生和其他)

C++ 运算符重载显示输出中的不规则行为 #包括 使用名称空间std; 阶级基础 { 公众: 虚拟布尔运算符==(常量基和其他)=0; }; 派生类:公共基 { 公众: 布尔运算符==(常量基和其他){return false;} 布尔运算符==(常量派生和其他),c++,polymorphism,virtual-functions,overriding,comparison-operators,C++,Polymorphism,Virtual Functions,Overriding,Comparison Operators,运算符重载显示输出中的不规则行为 #包括 使用名称空间std; 阶级基础 { 公众: 虚拟布尔运算符==(常量基和其他)=0; }; 派生类:公共基 { 公众: 布尔运算符==(常量基和其他){return false;} 布尔运算符==(常量派生和其他){return true;} }; int main() { 基数*a=新的导出值; 基准*b=a; std::cout但为什么它不调用任何重载运算符==?您正在比较指针。确实。我想您不是有意这样做的,但是除了引入动态转换之外,您还删除了第二个

运算符重载显示输出中的不规则行为
#包括
使用名称空间std;
阶级基础
{
公众:
虚拟布尔运算符==(常量基和其他)=0;
};
派生类:公共基
{
公众:
布尔运算符==(常量基和其他){return false;}
布尔运算符==(常量派生和其他){return true;}
};
int main()
{
基数*a=新的导出值;
基准*b=a;

std::cout但为什么它不调用任何重载运算符==?您正在比较指针。确实。我想您不是有意这样做的,但是除了引入动态转换之外,您还删除了第二个版本中的取消引用。@Push不,您只是忘记了在
动态转换之前有一个
*
,当然指针是相同,因此会比较相等。@push,因为您在指针上调用它!如果不是
true
(提示:没有星星!),那么
a==b
会产生什么结果?您只是在强制转换和比较两个指针,而不是它们指向的对象,所以这些运算符重载在这里甚至不会起作用。请尝试
*dynamic\u cast(b)==*dynamic_cast(a)
(当心星星!)看看会发生什么。
#include <iostream>
using namespace std;
class base
{
public:
  virtual bool operator ==( const base& other ) =0;
};

class derived : public base
{
public:
  bool operator ==( const base& other ) { return false; }
  bool operator ==( const derived& other ) { return true; }
};


int main()
{
  base* a = new derived;
  base* b = a;
  std::cout << ( *a == *b ) << std::endl;
  cout<< (dynamic_cast< base*>(b) == dynamic_cast< base*>(a));

}