将对象转换为父对象

时间:2014-04-15 19:32:55

标签: c++ inheritance casting parent

我在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。谁能给我一个如何做到这一点的建议?这甚至可能吗?

3 个答案:

答案 0 :(得分:2)

根据C ++标准

  

转换函数永远不会用于转换 a(可能是   cv-qualified)对象(可能是cv-qualified)相同的对象类型   (或对它的引用),到(可能是cv认证的)基类   该类型(或对它的引用),或(可能是cv-qualified)void。

您可以使用输出数据成员的虚拟函数,也可以定义运算符&lt;&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 );
}

答案 1 :(得分:0)

这就是7的印刷方式:

funct(s.operator parent());

要记住一点:

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

答案 2 :(得分:0)

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

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

您无法更改此方法。

您只能将继承更改为protected或private。编译器永远不会进行隐式转换,即使您定义了转换操作符。

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