类与对象-多态-案例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是一个指针,需要使用->操作符来访问它所指向的对象的成员。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值