C++ 笔记 关于多态的跟java不一样的使用方法

多态

使用面向对象语言的时候,熟练的运用多态是必须的。虽然我最早学的是C/C++,但是那个时候学的都是皮毛,入了个门而已,真正深入的理解面向对象语言是从JAVA开始的。

JAVA是一个非常人性化的语言,易学易用,其中多态的使用也非常容易理解。但是C++里面,虽然功能上相对于JAVA没有任何差别,但是使用起来貌似要更复杂一点。

1,基类和子类的函数调用区别
JAVA:

//SuperClass 扩展出  MyClass
SuperClass cls = new MyClass;
cls.func;//这里调用的是MyClass的func()方法

C++

//SuperClass 扩展出  MyClass
SuperClass* cls = new MyClass;
cls->func;//这里调用的是SuperClass的func()方法

说明:JAVA语言里面没有指针/引用/函数名的概念,只有一种使用方式,类似于C++的“引用”,所以直接用 “ . ”操作就可以了。
而C++里面,有“指针/引用/函数名”三种概念,点操作针对的是函数名调用和引用调用。如果要使用多态,只支持“引用/指针”两种操作模式,推荐使用指针模式,因为引用模式也使用“.”操作符,会产生二义性。

在没有任何设置的情况下,C++里面对于函数的调用是调用指针类型里面的函数。如上面这样:
cls是SuperClass类型,虽然创建并指向了一个MyClass,但是调用依然是SuperClass里面的对应函数。
为了实现调用子类里面的函数,需要将这个函数设置为虚函数,也就是
virtual func();
只需要在声明里设置就可以了。

2,关于析构函数的调用
因为C++有析构函数和手动delete的概念,所以一些操作跟JAVA也不一样。

如上所述,只有设置为虚函数的函数才会按照创建的实例来调用,否则会按照指针类型来调用。

所以,当调用delete cls的时候,只会自动调用SuperClass的析构函数,不会调用MyClass的析构函数。

所以为了调用MyClass的析构函数,需要将SuperClass的析构函数设置为虚函数
virtual ~SuperClass();
这样,所有子类也会继承为虚函数,那么,MyClass的析构函数都会被调用。

virtual关键字会被子类继承,即便子类没有声明virtual也是如此
但是,最好子类也标记virtual,为了让源代码更清晰。

3,纯虚函数/抽象类
纯虚函数相当于JAVA里面的抽象函数”abstract class”
只需要在声明的时候增加”=0即可”
virtual void mFunc() = 0;
不需要提供实现。包含纯虚函数的类就是抽象类,这个名称倒是跟JAVA一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值