第四十三讲 虚函数
class A
{
public:
void output();
};
class B: public A
{
public:
void output();
};
class C: publid B
{
public:
void output();
};
不同层次完全一样的函数头
C类中将会有三个output函数
void main()
{
A a;
a.output();
B b;
b.output();
C c;
c.output();
}
完全一样的函数头,无法根据参数来区分
执行时能根据不同的对象选择不同的output()函数,这种性质叫
做执行时多态
覆盖机制
指当我们的派生类当中自定义的成员函数如果和从基类中继承下
来的成员函数头完全一样,用派生类当中的成员函数覆盖掉基类
中的成员的函数
避免了二义性,根据对象来区分,可以看出是调用的哪个类的函
数
另外,改一下主函数,看一如下例子
void main()
{
A a, *p;
B b;
C c;
p = &a;
p->output();
p = &b;
p->output();
p = &c;
p->output();
}
本义是想输出a,b,c三个不同的output
事实上只会输出a的output
不能根据不同尖对象选择对应的output()函数,不具备多态性
再看如下例子
void function(A &a)
{
x.output();
}
void main()
{
A a;
B b;
C c;
function(a);
function(b);
function(c);
}
输出结果仍然是对象a的output,也是不能根据对象选择对应的
output函数
如何解决不具备多态性的问题
虚函数机制
在类中特别是基类的中定义成员(同名的函数)时前面加上
virtual关键字
用到虚函数的地方
当某个函数在不同层次的类中完全相同时,在程序执行时根据不
同对象,应该调用哪个层次的函数,
通过指针调用函数时,如果不加virtual关键字,函数只具备一
态性,(此情况下,所调用的函数在指针或引用的类中),加上
virtual后,指向的对象不同,则调用的函数所在的层次不同,
由对象所在的类来决定。
重载的时候,我们可以用参数的个数和类型来区分同名的函数
而在这里函数名和参数都相同
第四十四讲 实验
目的
验证覆盖机制
验证虚函数机制
基类的对象可以引用派生类的对象,而派生类的对象不能引用基
类的对象
注意点
1,当我们用对象来调用函数时,不用引入虚函数,因为有覆盖机
制
2,当我们没有引入虚函数时,能过指针调用output函数,只能指
针类当中的output函数,或者是引用类的output函数
3,当我们引入虚函数机制后,不管是派生类的还是基类的指针,
都可以指向他们任何类的对象,并且它指向哪个对象就指向那个
类的output函数,或者是所属类的output函数。
4,如果是基类指针指向类派生类时,虽然类型不一致,但系统会
自动转换,反过来派生类指针,指向基类的时候,不兼容,要自
己进行强制类型转换
#include <iostream.h>
class A
{
public:
virtual void output();
};
void A::output()
{
cout<<"a"<<endl;
}
class B: public A
{
public:
void output();
};
void B::output()
{
cout<<"b"<<endl;
}
class C: public B
{
public:
void output();
};
void C::output()
{
cout<<"c"<<endl;
}
void function(B &x)//不可以向下引用,但是加上强制转换后
可以成为多态性
{
x.output();
}
void main()
{
A a;
B b;
C c;
function((B &)a);//强制转换成B类的引用,使其具备
多态性
function(b);
function(c);
}
/*
void main()
{
A a, *p;
B b;
C c;
p = &a;
p->output();
p = &b;
p->output();
p = &c;
p->output();
}
*/
/*
void main()
{
A a;
B b;
C c;
a.output();
b.output();
c.output();
}
*/
第四十五讲 抽象类
别人只想继承函数名,不想继承函数的功能。重写这个函数,实
现不同的功能。
只写一个基类,定义一些成员作灶虚函数,而不实现函数,即什
么也没有,专门让人来继承重写,定义为虚函数,叫纯虚函数,
这个基类叫抽象类。
抽象类提供了一些公共的接口,继承抽象类的派生类,如果要定
义对象,必须实现这些接口的代码。
必须要重写纯虚函数,
抽象类不能定义对象,但可以定义抽象类的指针,这样就可以通
过指针实现多态性了。
抽象类可以派生出新的抽象类,也可以派生出具体类。
格式 没有函数体,让函数头等于0.
好了,课程结束了
感觉阿牛哥讲的不错,很精简,抛开了和C重复的内容,只讲面
向对象,和C++的关键的几个机制。我这个笔记没有写自己的一
些心得,一是因为以前对C++一点概念也没有,先打个基础,然
后这机制搞清楚
接下来找时间回过头复习一下吧