阿牛哥C++笔记---10

本文详细讲解了C++中的虚函数和覆盖机制,包括执行时多态的概念、覆盖机制的原理以及如何通过虚函数实现多态性。通过实例展示了如何在不同类层次上调用相应对象的函数,强调了抽象类和纯虚函数在多态中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四十三讲 虚函数

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++一点概念也没有,先打个基础,然

后这机制搞清楚

接下来找时间回过头复习一下吧

 



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值