自学内容网 自学内容网

类与对象-多态-案例1-计算器类

#include<iostream>
using namespace std;
//实现计算器抽系类
class Calculator
{
public:
virtual int getResult()
{
return 0;
}
int m_Num1;
int m_Num2;
};
//加法
class Addition :public Calculator
{
public:
int getResult()
{
return m_Num1 + m_Num2;
}
};
//减法
class Subtraction :public Calculator
{
public:
int getResult()
{
return m_Num1 - m_Num2;
}
};
//乘法
class Multiplication :public Calculator
{
public:
int getResult()
{
return m_Num1 * m_Num2;
}
};
void test01()
{
//父类指针或引用指向子类对象
//加法
Calculator* abc = new Addition;
abc->m_Num1 = 10;
abc->m_Num2 = 20;
cout << abc->m_Num1 << " + " << abc->m_Num2 << " = " << abc->getResult() << endl;
//用完记得销毁
delete abc;

//减法
abc = new Subtraction;
abc->m_Num1 = 10;
abc->m_Num2 = 20;
cout << abc->m_Num1 << " - " << abc->m_Num2 << " = " << abc->getResult() << endl;
//用完记得销毁
delete abc;

//乘法
abc = new Multiplication;
abc->m_Num1 = 10;
abc->m_Num2 = 20;
cout << abc->m_Num1 << " * " << abc->m_Num2 << " = " << abc->getResult() << endl;
//用完记得销毁
delete abc;

}
int main() {
test01();

return 0;
}

在代码Calculator* abc = new Addition;,为什么要用*呢

使用 * 的作用是声明一个指针变量 abc,该指针可以指向 Calculator 类型的对象或其派生类的对象。

  1. 声明指针变量:
  • Calculator* abc; 声明了一个指针变量 abc,该指针变量可以指向 Calculator 类型的对象或其派生类的对象。
  1. 动态分配内存:
  • new Addition; 这部分是使用 new 运算符在堆上动态分配了一个 Addition 类型的对象,并返回该对象的地址(即指针)。
  1. 类型匹配:
  • 因为 Addition 类是 Calculator 类的公有派生类,所以 Addition 对象的地址可以被赋值给 Calculator* 类型的指针变量。这也符合面向对象编程中的多态性原则,即派生类对象可以通过基类指针访问。

综上所述,Calculator* abc = new Addition; 表示 abc 是一个指向 Addition 对象(同时也是 Calculator 对象,因为 Addition 是其派生类)的指针。这种方式可以方便地通过基类指针来管理和操作派生类对象,实现多态性和灵活性。

如果没有使用 *,比如 Calculator abc = new Addition;,那么 abc 就会被声明为一个 Calculator 类型的对象,而不是指针,这将导致类型不匹配的编译错误,因为 new Addition; 返回的是一个指向 Addition 对象的指针,而不是 Calculator 类型的对象本身。

为什么不能使用.来访问m_Num1m_Num2成员变量呢?

在面向对象的编程中,当使用指针访问对象时,必须使用->操作符而不是.操作符。这是因为.操作符用于直接访问对象的成员,而指针则是一个地址,需要使用->来访问对象的成员。

Calculator* abc = new Addition;
abc->m_Num1 = 10;
abc->m_Num2 = 20;

这里的abc是一个指向Calculator类或其派生类对象的指针。因为abc是一个指针,所以需要使用->来访问它指向的对象的成员变量和成员函数。因此,正确的方式是abc->m_Num1abc->m_Num2,而不是abc.m_Num1abc.m_Num2

总结一下:

  • abc->m_Num1 表示通过指针abc访问对象的成员变量m_Num1
  • abc->m_Num2 表示通过指针abc访问对象的成员变量m_Num2

使用.操作符是针对对象本身的,而abc是一个指针,需要使用->操作符来访问它所指向的对象的成员。


原文地址:https://blog.csdn.net/weixin_61839295/article/details/140502163

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!