面向对象
C++与C最大的区别,就是C++可以面向对象编程。所谓面向对象,就是将实体抽象为对象,类就是同种类的对象的集合,如动物是一个类,狮子老虎熊猫是其中的对象。类由数据和方法构成。数据就是字面意思,比如动物的数据可以是年龄,体长,是否食肉等(数据不是数字)。方法是可以实现具体功能的函数,比如输出年龄,或者和另一个动物打一架。
#include<iostream>
using namespace std;
class animal{
public:
animal(string a){name.assign(a);}
void show(){cout<<"年龄是"<<age<<endl;}
void fight(animal b);
private:
string name;
int age, length;
bool vegetarian;
};//这里要分号
面向对象的三大特性
封装:将数据和方法封装在类里,保证了数据的安全性,并且使编程结构化,需要修改时更加明了。
继承:对已有的类增加或部分修改其数据或方法,来定义一个新的类,这个新的类叫做派生类(子类),旧的类叫基类(父类)。
多态:同一个操作(调用方法)对不同的对象可导致不同的行为。多态性允许将子类类型的指针赋值给父类类型的指针变量,此时调用该变量中的方法可以直接调用子类中定义的方法。C++中多态性通过虚函数实现。
class parent{//父类parent
...
};//不要忘了分号
class son: public parent{//子类son
...
};//虽然编译器会提醒
虚函数
虚函数是允许子类重新定义的函数,将子类指针赋予父类变量,通过该变量调用虚函数执行的是子类中的定义。在类中定义方法时在前面加virtual就使该函数变为虚函数,子类重写父类中声明的虚函数时,即使前面不用virtual声明,也是虚函数。
#include<iostream>
using namespace std;//这个分号也别忘
class father {//父类father
public:
virtual void fun() { cout << "father" << endl; }
};
class son : public father {//子类son
public:
void fun() { cout << "son" << endl; }
};
class grandson : public son {//孙子类grandson
public:
void fun() { cout << "grandson" << endl; }
};
int main(){
father* f;
son s;
grandson g;
f = &g;
f->fun();//调用grandson中的函数
f = &s;
f->fun();//调用son中的函数
return 0;
}
运行结果:
grandson
son
纯虚函数、抽象类
当基类表示一种抽象概念,不具体建立对象时,将其某一成员函数定义为虚函数
virtual void fun()=0;
这样的虚函数称为纯虚函数,其并不返回值0。事实上,纯虚函数不能被调用,只能调用子类中对应的重写过的函数。含有纯虚函数的类就是抽象类。抽象类不能建立对象,也不能用作参数类型、函数返回类型,但可以定义指针和引用,其指针可以指向它的派生类。抽象类的派生类需要实现基类中的纯虚函数,不然则该派生类依然为抽象类。
覆盖、隐藏
父类与子类有同名方法,且其参数相同,父类定义若有virtual,则该函数是虚函数,父类方法可以被子类覆盖。
父类与子类有同名方法,且其参数相同,定义时没有virtual,则使用的变量或指针是什么类,就调用什么类的方法,与具体赋值无关。此时,子类方法可以隐藏父类。
#include<iostream>
using namespace std;
class father {//父类father
public:
void fun() { cout << "father" << endl; }
};
class son : public father {//子类son
public:
void fun() { cout << "son" << endl; }
};
class grandson : public son {//孙子类grandson
public:
void fun() { cout << "grandson" << endl; }
};
int main() {
father* f;
son s;
grandson g;
f = &g;
f->fun();//虽然f赋的值是grandson类型的指针,但仍调用father中的方法
s.fun();//调用son中的方法
return 0;
}
运行结果:
father
son