C++学习中的一点心得以及疑惑01

在C++学习中,作者通过一个编程实例探讨了多态中的权限问题。由于忘记在Add类中声明public,导致无法直接访问特定函数。经过分析,作者发现子类继承父类并重写虚函数后,子类对象通过父类指针调用函数时,权限会保持与父类虚函数一致。这涉及到动态多态的机制,即父类指针调用的是子类的虚函数地址。通过查看类的内部结构,确认了这一理解。总结出,在动态多态使用时,子类重写函数的权限与父类虚函数保持一致。
摘要由CSDN通过智能技术生成

多态中的原理分析

源代码:

```cpp
//利用多态实现计算器
//实现计算器抽象类
class AbstructCalculate
{
public:
	int m_Num1 = 0;
	int m_Num2 = 0;
	virtual int getResult0()
	{	return 0;	}
};
//加法类
class Add :public AbstructCalculate
{
//public:
	int getResult0()
	{
		return m_Num1 + m_Num2;
	}
};
//减法类
class Sub :public AbstructCalculate
{
public:
	int getResult0()
	{
		return m_Num1 - m_Num2;
	}
};
//乘法类
class Mul :public AbstructCalculate
{
public:
	int getResult0()
	{
		return m_Num1 * m_Num2;
	}
};
void test02()
{
	//多态使用条件,父类的指针或者引用 指向 子类对象
	AbstructCalculate* c2 = new Add;//父子型 类型转换,优点:方便,(后面减法乘法都可以用同一个 父类指针)->多

```cpp
态
	c2->m_Num1 = 100;				//对照着下面的加法实现,以及减法和乘法的【c2->getResult0()】,理解多态含义(同一语句,多种形态)
	c2->m_Num2 = 100;
	cout << c2->m_Num1 << "+" << c2->m_Num2 << "=" << c2->getResult0() << endl;
	delete c2;
	//减法
	c2 = new Sub;
	c2->m_Num1 = 100;
	c2->m_Num2 = 100;
	cout << c2->m_Num1 << "-" << c2->m_Num2 << "=" << c2->getResult0() << endl;
	delete c2;//用完释放堆区空间
	//乘法
	c2 = new Mul;
	c2->m_Num1 = 100;
	c2->m_Num2 = 100;
	cout << c2->m_Num1 << "*" << c2->m_Num2 << "=" << c2->getResult0() << endl;
	delete c2;
	/*Add a;
	a.m_Num1 = 10;
	a.m_Num2 = 20;
	cout<<a.getResult0()<<endl;*/
}
int main()
{
	test02();
	system("pause");
	return 0;
}

总结:在编写代买过程中,将Add中忘记了加上public:,导致在后面想尝试仅利用Add类来实现加法时,无法访问【Add::a.getResult0()】,由此引发疑问(为什么Add类中的默认私密权限的函数在【

cout << c2->m_Num1 << "+" << c2->m_Num2 << "=" << c2->getResult0() << endl;

】这个语句中被调用了),转去看前一章学习的内容发现,是自己对(当子类重写父类虚函数,子类的虚函数表内部会替换成子类的虚函数地址)以及(动态多态的使用:父类的指针或者引用执行或指向子类对象)这两句话理解得不到位。
在执行完【AbstructCalculate* c2 = new Add;】后,c2这个指针便指向了继承后的Add类,并且,继承后的Add类中的getResult函数也是继承后的虚函数结构、是不是就意味着,Add中的getResult是属于继承后的public公共权限,然后其中继承的虚函数表内部换成了Add类中的虚函数地址。后期访问时可以访问?
【是不是意味着动态多态使用的过程中,其子类的重写函数的权限是和父类中的虚函数保持一致的?】
利用开发人员工具查看 Add类的内部结构:
继承前:继承前的Add
继承后;继承后的Add
对比发现,继承后访问时,是利用从父类继承下来的指针(vfptr)调用【Add::getResult】。
这里我回过头再看【AbstructCalculate* c2 = new Add;】,对照着Add继承前后内部结构图,是不是可以认为,c2指向的 类 其实是一个 重写函数被更改过后的 父类!所以调用时 重写函数时,重写函数的权限就会与父类的权限保持一致!!!**

今天学习到4.7.5,有了新的体会。
总结:用一个父类的指针或者引用指向子类对象,那么整体上还是一个父类的框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值