天天看点

C++类和继承

C++与C语言类似,运算效率高,与java也有相似之处

一:基础

1.输入:C语言中使用scanf来输入,需要声明变量的类型,头文件include<stdio.h>。

               C++中只需要“cin>>变量”即可实现,头文件include<iostream>。

2.输出:C语言输出用printf执行,也需要声明变量的类型。

               C++用“cout<<变量”即可完成。

二:类与继承

类在Java中广泛应用,C++中也可以用到类,但在定义方式上和Java不同,C++类中也可以由构造函数。

例如,现在定义一个Animal类,有构造方法和一个void型eat方法和breathe方法

#include <iostream>
using namespace std;
class Animal
{
public :        //方法为公共类型,还可以是protected或private型
    Animal()    //构造方法
    {
        cout<<"Hello Animal"<<endl;
    }
    void eat()  //void型eat方法
    {
        cout<<"Animal eat"<<endl;
    }
    void breathe()
    {
        cout<<"Animal breathe"<<endl;
    }
};
           

这样一个类就定义完成了。现在要求定义一个子类Fish,FishheAnimal呼吸方式不同,要求在Fish类中将breathe方法改为“Fish bubble”且要有子类的构造方法

class Fish:public Animal   //java用extends表示继承,C++用":public 父类"继承
{
public:
    Fish()                 //Fish 构造方法
    {
        cout<<"Hello Fish"<<endl;
    }
    void breathe()
    {
        cout<<"Fish bubble"<<endl; //Fish对breathe方法进行覆盖
    }
};
           

此时如果定义Fish的一个对象 fh,则fh.breathe()输出将会是——Fish bubble

假如现在想让Fish的breathe方法既能输出父类的breathe方法又能输出自己的breathe方法该怎么办?

这涉及了继承关系中的方法重写,实现代码如下:

void breathe()
    {
        Animal::breathe(); //在子类方法中添加父类方法即可,“::”表示作用域
        cout<<"Fish bubble"<<endl; 
    }
           

如果现在我在定义一个函数fn如下

void fn(Animal *pan)
{
    pan->breathe();
}
           

在主函数中定义Animal类指针*p,定义Fish类对象fh,令p=&fh,将p带入函数fn,fn(p);输出会是什么?

答案——只有"Animal breathe"!Fish的“Fish bubble”哪去了?

这就涉及了C++的另一个特性——多态性,如果想在输出时带有Fish类特有的输出,只需在Animal类breathe方法前加上“virtual”即可

virtual void breathe()
{
    cout<<"Animal breathe"<<endl;
}
           

“virtual”下,只要传的是子类的指针,在调用方法时,只要所调用的方法子类有就调用子类的,否则调用父类的。

Java中有抽象类,C++也有,Java中抽象类类名前需要写abstract关键字,C++不用,定义是正常写就行!

只需对抽象方法做改动,例将breathe方法改为抽象方法

virtual void breathe()=0;
           

在子类中将breathe方法实例化即可。