在c++中转换对象

Convert objects in c++

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

我不明白转换是如何工作的。。例如代码:

class Base
{
 private:
   int days;
 public:
   Base(int d):days(d){}
   virtual void somefunc..
   ...
};
class DayInYear:public Base
{
 public:
   DayInYear(int diy):Base(diy){}
   ...
}
class Month:public Base
{
 private:
   int month;
 public:
   Mounth(int dm,int m):Base(dm),month(m){}
   ...
}
int main()
{
 Base *arr[2] = {new DayInYear(100),new Month(20,4)};
 ...
}

我的问题是如何将Month类型转换为DayInYear类型?

编译器将无法为您自动转换类型,因为它们没有足够的相关性。

可以Month类中构建强制转换运算符。这将有原型

operator DayInYear() const;

并返回CCD_ 2对象。

然后可以编写(DayInYear)m;,其中mMonth实例。

基本上有两种方法。

DayInYear创建一个构造函数,该构造函数采用Month:

class DayInYear:public Base
{
 public:
   DayInYear(Month m) { //Create a DayInYear from Month }
   ...
}

或者,在Month中创建一个提供DayInYear:的强制转换运算符

class Month:public Base
{
  public:
   operator DayInYear() const { //create a DayInYear  }
   ...
}

或者两者兼而有之。

当使用C风格的强制转换时,很多人会对此感到困惑:

Month m;
DayInYear day1 = DayInYear(m); //DayInYear constructor
DayInYear day2 = (DayInYear)m; //Cast Operator

当你说你不"理解转换是如何工作的"时,我假设你指的是这行代码:

Base *arr[2] = {new DayInYear(100),new Month(20,4)};

使用这行代码,从技术上讲没有进行转换,相反,这是多态性的概念。在C++等面向对象编程语言中,多态性指的是单个对象可以采用多种不同形式的想法。在上面显示的示例中,DayInYear和Month并没有真正转换为Base类型。这两个类都继承自基类,因此它们可以称为基类。DayInYear和Month持有的所有其他数据仍然存在,只是在被分配到其基类时无法访问。当这些对象被分配到其超类Base时,它们只能像Base对象一样进行交互,但在幕后,它们仍然是您创建它们的对象。多态性是这里的关键思想,也是面向对象编程中需要理解的一个非常重要的概念,您可以查看以下链接:http://www.cplusplus.com/doc/tutorial/polymorphism/

现在,对于您关于将Month转换为DayInYear的问题,我不确定您为什么要这样做。首先,一个月是一年中的一天是没有意义的,因为它们是非常不同的东西。这也可能导致数据丢失,因为Month包含Month属性,而DayInYear不包含。然而,如果你觉得需要进行这种转换,你会有几个选择。首先,在DayInYear类中有一个构造函数,它以Month作为参数来创建DayInYears对象:

DayInYear(Month month) { //Code that converts Month to DayInYear }

另一种选择是使用赋值运算符,该运算符允许直接将Month赋值为DayInYear:在您的DayInYear课程中:

DayInYear& operator = (const Month& month) { //code for assignment }

总的来说,你现在可以这样做:

Month month(2, 3);
DayInYear dayInYear = month;

最后一个选项是在Month类中使用类型转换运算符:

operator DayInYear() {//conversion code} 

这将允许在两者之间进行铸造。

希望这能有所帮助。