您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-25 13:49 253 查看

多态

使用面向对象语言的时候,熟练的运用多态是必须的。虽然我最早学的是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一样。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言