类与对象-多态-案例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
类型的对象或其派生类的对象。
- 声明指针变量:
Calculator* abc;
声明了一个指针变量abc
,该指针变量可以指向Calculator
类型的对象或其派生类的对象。
- 动态分配内存:
new Addition;
这部分是使用new
运算符在堆上动态分配了一个Addition
类型的对象,并返回该对象的地址(即指针)。
- 类型匹配:
- 因为
Addition
类是Calculator
类的公有派生类,所以Addition
对象的地址可以被赋值给Calculator*
类型的指针变量。这也符合面向对象编程中的多态性原则,即派生类对象可以通过基类指针访问。
综上所述,Calculator* abc = new Addition;
表示 abc
是一个指向 Addition
对象(同时也是 Calculator
对象,因为 Addition
是其派生类)的指针。这种方式可以方便地通过基类指针来管理和操作派生类对象,实现多态性和灵活性。
如果没有使用 *
,比如 Calculator abc = new Addition;
,那么 abc
就会被声明为一个 Calculator
类型的对象,而不是指针,这将导致类型不匹配的编译错误,因为 new Addition;
返回的是一个指向 Addition
对象的指针,而不是 Calculator
类型的对象本身。
为什么不能使用
.
来访问m_Num1
和m_Num2
成员变量呢?
在面向对象的编程中,当使用指针访问对象时,必须使用->
操作符而不是.
操作符。这是因为.
操作符用于直接访问对象的成员,而指针则是一个地址,需要使用->
来访问对象的成员。
Calculator* abc = new Addition;
abc->m_Num1 = 10;
abc->m_Num2 = 20;
这里的abc
是一个指向Calculator
类或其派生类对象的指针。因为abc
是一个指针,所以需要使用->
来访问它指向的对象的成员变量和成员函数。因此,正确的方式是abc->m_Num1
和abc->m_Num2
,而不是abc.m_Num1
和abc.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)!