抽象类 纯虚函数 虚函数 派生类 派生类对象 基类对象 ——调用顺序,用基类调用派生类的方法

2021年9月30日 5点热度 0条评论 来源: bluevox3000

#include <iostream>
using 
namespace 
std;
class 
A
{
protected
:
//通常这里为protected
virtual
 
void
 
display (){cout<<
"A virtual void display ()"
<< endl;}
//此处若有=0,则A为抽象类
} ;
class 
B:
public 
A
{
protected
:
B(){cout<<
"B()"
<<endl;}
~B(){cout<<
"~B()"
<<endl;display();}
virtual void display(){ cout<<"B virtual void display ()"<<endl;}
//派生类中有虚函数
};
class 
C:
public 
B
{
public
:
C(){cout<<
"C()"
<<endl;}
~C(){cout<<
"~C()"
<<endl;}
};  
main()
{

C c;
system
(
"pause"
);
return 
0;
}
*****************************************
Q: 
1、
派生类对象如何调用基类的成员函数,特别是protected的成员函数?
2、
如何通过基类对象访问派生类的成员函数,特别是基类没有定义的某些方法?
3、
建立对象时,调用构造函数的顺序,析构函数的顺序?
4、

区分覆盖、继承、多态、重载

待分析解决


*******************************************************************

多态有两种表现形式:重载和覆盖。
重载(overload):是发生在同一类中。与什么父类子类、继承毫无关系。标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已! 
覆盖(override):是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系。
多态:是父类调子类的实现,继承是子类调父类的实现,由于多态时不知道会被哪个子类继承,所以定义的东西都是虚函数,当你执行这个虚函数时,首先找到该虚函数代表的实体子类,并执行子类中的相关代码。

**************************************************************************

比如有一个父类superClass,它有2个子类subClass1,subClass2。superClass有一个方法
func(),两个子类都重写了这个方法。那么我们可以定义一个superClass的引用obj,让它指向一个子类的对象,比如superClass obj = new subClass1();那么我们调用obj.func()方法时候,会进行动态绑定,也就是obj它的实际类型的func()方法,即subClass1的func()方法。同样你写superClass obj = new subClass2();obj.func()其实调用的是subClass2的func()方法。这种由于子类重写父类方法,然后用父类引用指向子类对象,调用方法时候会进行动态绑定,这就是多态多态对程序的扩展具有非常大的作用,比如你要再有一个subClass3,你需要改动的东西会少很多,要是使用了配置文件那就可以不动源代码了。
    原文作者:bluevox3000
    原文地址: https://blog.csdn.net/bluevox3000/article/details/18001233
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。