继承和多态

继承

单继承

class A: [继承方式] B { };

多继承

class A: [继承方式] B, [继承方式] C { };

[继承方式]public,private,protected.

多继承的二义性
如图所示

类C同时继承B1,B2,在调用基类A的成员变量a时,编译器报错,不知道是从类B1还是从类B2继承来访问a。
解决方案是添加virtual,实质上编译器给变量成员添加了属性

class B1:virtual public A {};
class B2:virtual public A {};

由于产生歧义,工程上不建议使用。

多态

通过一个基类指针调用相同的函数,由于基类指针指向对象类类型不同,就会得到不同的效果和特征,这就是 c++ 多态性的体现。
ex.

#include <iostream>

using namespace std;

class Generation
{
public:
	Generation() {}
	Generation(int price) {	this->p1 = price; }
	~Generation() {}
	virtual int getPrice() { cout << "G1 p1 " << p1 << endl; return p1; }//重点在于virtual关键字
private:
	int p1;
};

class GenerationTwo:public Generation
{
public:
	GenerationTwo(int price) { this->p2 = price; }
	~GenerationTwo() {}
	int getPrice() { cout << "G2 p2 " << p2 << endl; return p2; }
private:
	int p2;
};

class GenerationThree:public Generation
{
public:
	GenerationThree(int price) { this->p3 = price; }
	~GenerationThree() {}
	int getPrice() { cout << "G3 p3 " << p3 << endl; return p3; }
private:
	int p3;
};

void compare(Generation *pf, Generation *pb)
{
	if (pf->getPrice() > pb->getPrice())
	{
		cout << "front cost more than the back one" << endl;
	}
	else 
	{
		cout << "front cost less than the back one" << endl;	
	}

}

int main(int argc, char const *argv[])
{
	GenerationTwo 		gt2(20);
	GenerationThree		gt3(15);
	compare(&gt2, &gt3);

	return 0;
}

运行结果如下图所示,
运行结果
总结下实现多态的条件:

  1. 有继承
  2. 有虚函数重写
  3. 用父类指针(引用)指向子类对象

理解为啥加了virtual关键字能得到这样的效果?
运行时的实现依照指针的内容,编译时的实现根据指针的类型,声明为virtual的函数会被绑定到运行时 (late bindling),则用父类指针指向子类对象,其函数调用子类virtual函数;而non-virtual函数在编译器间就被绑定(early binding),则用父类指针指向子类对象,其函数调用父类non-virtual函数。

虚析构函数

何为虚析构函数:在基类析构函数前加virtual关键字。
为了解决什么问题:解决内存泄漏问题。

对于如上继承关系的类A,B,C,在 new 对象C 时,分别调用构造器A,B,C产生对于的内存,当使用父类指针释放子类内存时,实际上只释放了基类A构造函数开辟的内存,类B,C的内存并没有释放,造成内存泄漏。

void deletesomeone(A *base) 
{ 
	delete base;  //并不会表现多态这种属性
}
void test() 
{ 
    C *t = new C; 
    deletesomeone(t); 
}
重载重写重定义

重载发生在一个类之间,重写发生在两个类之间,虚函数重写发生多态,非虚函数重写也可称为重定义

内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158192.168.0.159)上安装配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFSYARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、ScalaFlink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台搭建提供详细的安装指南,确保各组件能够顺利安装配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的搭建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值