栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ 继承与多态 续

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ 继承与多态 续

继承与多态

动态联编纯虚函数抽象类

动态联编

联编是指计算机程序自身彼此关联的过程,是把一个标识符名和一个存储地址联系在一起的过程,也就是把一条消息和一个对象的操作相结合的过程

如果使用基类指针或引用指明派生类对象并使用该指针调用虚函数(成员选择符用箭头号“->”),则程序动态地(运行时)选择该派生类的虚函数,称为动态联编;动态联编亦称滞后联编

如果使用对象名和点成员选择运算符 “.” 引用特定的一个对象来调用虚函数,则被调用的虚函数是在编译时确定的(称为静态联编)

class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x)
	{}
	virtual void add()
	{
		cout << "Object::add" << endl;
	}
	virtual void fun()
	{
		cout << "Object::fun" << endl;
	}
};
class base :public Object
{
private:
	int num;
public:
	base(int x = 0) :Object(x + 10), num(x)
	{}
	virtual void add()
	{
		cout << "base::add" << endl;
	}
	virtual void fun(int x)
	{
		cout << "base::fun(int x)" << endl;
	}
};

int main()
{
	Object* op = NULL;
	base* bp = NULL;
	base base(10);
	
	op = &base;
	op->add();
	op->fun();
	//op->fun(12); error
	//静态联编过程

	bp = &base;
	bp->add();
	//bp->fun(); error 此处将父类方法隐藏
	bp->fun(12);
}


对于Object,仅有两个虚表函数,所以无法调用op->fun(12);,对于bp,去调用add()是正确的,但是去调用fun()的时候,在编译过程中由于base中的虚函数与Object中的虚函数,同名而不同参;此时编译发生同名隐藏,会默认为是有参数的fun()函数bp->fun(12);是正确的

若使用bp去调用无参的fun()函数,则通过此方式bp->Object::fun();来进行调用

非虚析构函数

class Object
{
private:
	int value;
public:
	Object(int x = 0) :value(x)
	{
		cout << "Create Object" << this << endl;
	}
	virtual void add()
	{
		cout << "Object::add" << endl;
	}
	virtual void fun()
	{
		cout << "Object::fun" << endl;
	}
	~Object()
	{
		cout << "Destroy Object" << this << endl;
	}
};
class base :public Object
{
private:
	int num;
public:
	base(int x = 0) :Object(x + 10), num(x)
	{
		cout << "Create base" << this << endl;
	}
	virtual void add()
	{
		cout << "base::add" << endl;
	}
	virtual void fun(int x)
	{
		cout << "base::fun(int x)" << endl;
	}
	~base()
	{
		cout << "Destroy base" << this << endl;
	}
};

int main()
{
	Object* op = new base(10);
	op->add();

	delete op;
	op = NULL;
	return 0;
}

在这里仅调用了Object的析构函数,而没有调用base的析构函数

析构函数为非虚函数,系统在编译过程中,根据op的类型进行绑定,则只会调动Object的虚构函数

若为了达到运行时的多态,则需要将析构函数定义为虚函数

	virtual ~Object()
	{
		cout << "Destroy Object" << this << endl;
	}

纯虚函数

纯虚函数是指被标明为不具体实现的虚拟成员函数,它用于这样的情况:定义一个基类时,会遇到无法定义基类中虚函数的具体实现,其实现依赖于不同的派生类

定义纯虚函数的一般格式如下:

virtual 返回类型 函数名(参数表)= 0; “=0”表明程序员将不定义该函数,函数声明是为派生类保留一个位置。“=0”本质上是将指向函数体的指针定为 “NULL”

抽象类

含有纯虚函数的基类不能用来定义对象的

纯虚函数没有实现部分,不能产生对象,所以含有纯虚函数的类是抽象类

带纯虚函数的类称为抽象类,抽象类是一种特殊的类,它是为了抽象和设计的目的而建立的,它处于继承层次结构的较上层,抽象类是不能定义对象的,在实际中为了强调一个类是抽象类,可将该类的构造函数说明为保护的访问控制权限

抽象类的主要作用是将有关的组织在一个继承层次结构中,由它来为它们提供一个公共的根,相关的子类是从这个根派生出来的

抽象类刻画了一组子类的操作接口的通用语义,这些语义也传给子类;一般而言,抽象类只描述这组子类共同的操作接口,而完整的实现留给子类

抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出,如果派生类没有重新定义纯虚函数,而派生类只是继承基类的纯虚函数,则这个派生类依然还是一个抽象类,如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体类了

抽象类的规定

抽象类只能用作其他类的基类,不能建立抽象类对象抽象类不能用作参数类型、函数返回类型或显示转换的类型可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784646.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号