将对象强制转换为父对象

Cast object to parent

本文关键字:对象 转换      更新时间:2023-10-16

我在C++中有继承问题。以下是我想做的:

class parent
{
   public:
   int a;
};
class son : public parent
{
   public:
   int b;
   operator parent()
   {
      parent p; p.a = a + b;
      return p;
   }
}

void funct(parent a)
{
    cout<<a.a;
}
son s; s.a = 3; s.b = 4;
funct(s);

我希望它能打印出7。取而代之的是,在不影响任何内容的情况下隐式地进行铸造,并打印出3。有人能给我一个如何做这件事的建议吗?这可能吗?

根据C++标准

转换函数从不用于转换A(可能cv限定)对象到(可能是cv限定的)相同对象类型(或对它的引用),到的(可能是cv合格的)基类该类型(或对它的引用),或to(可能是cv限定的)void。

您可以使用输出数据成员的虚拟函数,也可以定义运算符<lt;作为类的伪虚拟(即调用虚拟函数)。

例如

class parent
{
   public:
   virtual std::ostream & out( std::ostream &os ) const { return os << a; }
   int a;
};
class son : public parent
{
   public:
   int b;
   std::ostream & out( std::ostream &os ) const { return os << a + b; }
};
std::ostream & operator <<( std::ostream &os, const parent &obj )
{
   return obj.out( os );
}

这就是打印7的方式:

funct(s.operator parent());

还有一点需要记住:

funct(s)//将导致对象切片,因为"funct"按值获取基类对象。

对象通过以下方法自动转换为父类:

operator base_type&() {return (base_type&)*this;}

您无法更改此方法。

您只能将继承更改为受保护继承或私有继承。编译器从不执行隐式强制转换,即使您定义了强制转换运算符也是如此。

您只能编写一个普通的方法,该方法可以执行强制转换并在需要时调用它。