【C++】继承&虚函数
发布网友
发布时间:2024-10-01 10:22
我来回答
共1个回答
热心网友
时间:2024-10-23 09:37
继承机制在C++中用于实现更高层次的重用性,通过继承已有的类派生出新的类,这通常比设计新类要容易很多。借助继承,我们无需复制原始类代码,只需提供新特性,即使不访问源代码也可以派生出类。简单继承中,派生类的构造函数会首先调用基类的构造函数,然后调用自身构造函数。若未在成员初始化列表中提供基类构造函数,则默认调用基类的默认构造函数。派生类析构时,先调用派生类析构函数,然后基类析构函数。
基类指针和引用与派生类对象体现了多态性,即基类指针或引用只能用于调用基类方法。通过引用兼容性,可将基类对象初始化为派生类对象,如使用派生类对象初始化基类对象。基类对象可以同时指向基类和派生类对象,这利用数组表示多种类型对象的特性,实现多态性。
公有继承建立一种“is-a”关系,即派生类对象同时也是基类对象,能执行基类对象的所有操作。公有继承是最常用的继承方式。基类中可定义虚方法(virtual),用于在基类指针和引用指向派生类时,根据对象类型调用相应版本的虚函数。虚函数的实现由编译器决定,通常通过为每个对象添加隐藏成员,保存指向函数地址数组的指针,即虚函数表(virtual function table)。
虚函数的存在因编译期间无法确定具体调用对象而引入,虚函数表在内存和执行速度方面带来成本。构造函数不能是虚方法,因为创建派生类对象时,首先调用基类构造函数,然后派生类构造函数使用基类构造函数。析构函数应当是虚函数,除非类不作为基类使用。友元不能是虚函数,但可通过使用虚成员函数解决设计问题。如果派生类没有重新定义虚函数,则使用基类版本。重新定义将隐藏基类方法,但不会生成函数的两个版本。
程序调用函数时,编译器在静态联编中通过查看函数参数和名称确定使用哪个函数代码块。然而,虚函数使这项工作在动态联编中更为复杂,要求编译器生成能够在运行时选择正确虚方法的代码。动态联编增加了处理开销,但静态联编更合理且效率更高,因此通常作为C++的默认选择。
保护成员在外部世界与私有成员相似,但在派生类中与公有成员相似。使用保护数据成员简化了代码编写,但存在设计缺陷,因为派生类中这些保护成员变为公有、可访问。抽象基类(ABC)通过纯虚函数提供未实现的函数,要求具体派生类覆盖纯虚函数,确保组件设计遵循接口规则。
在考虑对派生类进行构造、析构等操作时,需考虑基类的构建。如果基类使用了动态内存分配,并重新定义了赋值和复制构造函数,则在操作派生类时需注意。
公有继承的考虑因素包括继承层次、访问控制、多态性、虚函数的使用与注意事项、构造和析构时的基类操作,以及抽象基类的设计。在设计类结构时,理解这些考虑因素有助于创建灵活、可扩展且易于维护的代码。
c加加是什么
开始,C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。 虚函数(virtualfunction)、运算符重载(OperatorOverloading)、多重继承(MultipleInheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(NameSpace)逐渐被加入标准。 抢首赞 已赞过 已踩过< 你对这个回答的评价是? 评论 分享...
请问C++中的引用符号“&”到底怎么使用?
1,取地址 int i=1;int pi=&i;2,位运算,表求按位与 int a=1,b=3;int c=a&b;3,引用 int a;int &b=a;//b是a的引用,b等同于a
c++和c语言有什么区别啊?那我们单片机用什么编程啊?
对语言本身而言,C是C++的子集,那么是什么样的一个子集?从上文可以看出, C实现了C++中过程化控制及其它相关功能,而在C++中的C(我称它为“C+”),相对于原来的C还有所加强,引入了重载、内联函数、异常处理等等玩艺儿,C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类...
c语言与cnbsp;++
即是著名的ANSInbsp;C。 1978年由美国电话电报公司(ATamp;amp;T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THEnbsp;Cnbsp;PROGRAMMINGnbsp;LANGUAGE”一书。通常简称为《Kamp;amp;R》,
编程<-- Vtable什么意思
Vtable,虚函数表,编译器会为每个有虚函数的类创建一个虚函数表,该虚函数表将被该类的所有对象共享。类的每个虚成员占据虚函数表中的一行。如果类中有N个虚函数,那么其虚函数表将有N*4字节的大小。基类有一个这样的表,它里面放了它自己的虚函数指针。派生类也继承了这个表,如果在派生类里改变...
JAVA.包 JAVA类 JAVA APPLET ...等跟JAVA挨得上边得都要!
5. 请讲一讲析构函数和虚函数的用法和作用。6. Error与Exception有什么区别?Error表示系统级的错误和程序不必处理的异常,Exception表示需要捕捉或者需要程序进行处理的异常。7. 在java中一个类被声明为final类型,表示了什么意思?表示该类不能被继承,是顶级类。8. 描述一下你最常用的编程风格。9. heap和stack有...
java是什么?怎么念?
Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++ 语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 3、Java语言是分布式的。Java语言支持Internet应用的开发...
C++语言是什么啊?
一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++...
有人知道C++吗?是C语言难还是C++难?
一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准。1998年国际标准组织(ISO)颁布了C++...