[C++]---多态及相关知识

本文详细介绍了C++中的多态,包括多态的概念、实现条件、C++11的`final`和`override`关键字,以及抽象类、虚函数表、动态绑定等原理。此外,还探讨了多态中的重要问题,如虚函数与静态成员、构造函数和析构函数的关系。
摘要由CSDN通过智能技术生成

一.多态定义及实现

1.1概念

具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。

举个栗子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。

1.2实现多态

多态条件:

  1. 前提:继承条件下;
  2. 父类存在虚函数,且子类完成该虚函数的重写。 函数重写:子类父类存在接口完全相同的函数(函数名,参数,返回值完全相同) 例外:协变
  3. 调用虚函数的类型必须是指针或者引用
  4. 一般使用父类对象的指针或引用指向子类对象.
  • 多态:看指针/引用实际指向的对象是什么, 实际执行的就是对应对象的方法。
  • 非多态看类型: 看指针/引用所代表的类型,是什么类型就执行对应类型的方法。
class Person
{
public:
	//virtual 虚函数
	virtual void buy()
	{
		cout << "全价票" << endl;
	}
};
class Student : public Person
{
public:
	virtual void buy()
	{
		cout << "Student 半价票" << endl;
	}
};

class Teacher : public Person
{
public:
	virtual void buy()
	{
		cout << "Teacher全价票" << endl;
	}
};

void test()
{
	Student s;
	//非多态:值拷贝
	Person ps = s;
	ps.buy();//全价票

	//多态: 引用执行虚函数
	Person& rs = s;
	rs.buy();//Student半价票
	//多态: 指针执行虚函数
	Person* pss = &s;
	pss->buy();//Student半价票
	Teacher t;
	//多态: 引用执行虚函数
	Person& rt = t;
	rt.buy();//Teacher全价票
}

注意:

  1. 如果父类没有虚函数的声明,即使子类有虚函数的声明,子类和父类的对应函数构成函数隐藏,不是函数重写,所以不会产生多态行为。但是如果子类有对应的子类,子类的函数和子子类的函数会构成函数重写,会产生多态行为。总之只有继承体系的上层中有对应的虚函数,此体系中的对应函数就会产生多态行为。
  2. 如果父类有虚函数的声明,子类对应的函数就是虚函数,构成多态。
  3. 建议所以的虚函数都添加 virtual 的声明
class Person
{
public:
	//virtual 虚函数
	virtual void buy()
	{
		cout << "全价票" << endl;
	}
};
class Student : public Person
{
public:
	virtual void buy()
	{
		cout << "Student 半价票" << endl;
	}
};
class Teacher : public Person
{
public:
	virtual void buy()
	{
		cout << "Teacher全价票" << endl;
	}
};
void Fun(Person p)//传的是值 ,不是引用或者指针,不构成多态
{
	p.buy();
}
void test()
{
	cout << "非多态" << endl;
	Student s;
	Person ps = s;
	Teacher t;
	Fun(ps);//全价票
	Fun(s);//全价票
	Fun(t);//全价票
	cout << endl;
}
void Fun2(Person &p)//传的是引用或者指针,构成多态
{
	p.buy();
}
void test2()
{
	cout << "多态" << endl;
	Student s;
	Person ps = s;
	Teacher t;
	Fun2(ps);//全价票
	Fun2(s);//Student半价票
	Fun2(t);//Teacher全价票
	cout << endl;
}
int main()
{
	test();
	test2();
	system("pause");
	return 0;
}

下面是协变下多态例子:

//协变场景下的多态
//函数名相同,参数相同,返回值类型不同-》比如构成父子关系的指针或引用
class A
{};
class B :public A
{};
class Person
{
public:
	//virtual 虚函数
	virtual A& buy()
	{
		cout << "全价票" << endl;
		return A();
	}
};
class Student : public Person
{
public:
	virtual B& buy()
	{
		cout << "Student 半价票" << endl;
		return B();
	}
};

class Teacher : public Person
{
public:
	virtual B& buy()
	{
		cout << "Teacher全价票" << endl;
		return B();
	}
};
void test2()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值