»
(06)C++14 类及虚函数
(18)C++14 智能指针及引用计数*
(19)C++14 多线程pthread*
(20)C++14 同步锁mutex*
(24)C++中的计时与等待*
(25)C++中的高精度计算*
(27)C++14 std::string*
(31)C++高级技能*
类就是数据和函数的集合。
C++中的类是这样定义的:
class 类名:(修饰符)父类名{
private:
成员变量以及成员方法(成员函数)
protect:
成员变量以及成员方法(成员函数)
public:
成员变量以及成员方法(成员函数)
}
在C++的类中可以声明static变量,static变量是类的属性,是这个类的所有对象共享的属性。static的声明在类中,但定义必须在全局作用域内做定义,比如:
class Car{
private:
static int totalCount;
public:
int getTotalCount(){
return totalCount;
}
}
static int Car::totalCount=0;
在C++中,类的继承也可以有修饰词:public、protected、private。它们修饰的属性和函数(类的方法)的可见程度是与父类中的成员的修饰词的叠加(也就是两者取最小可见程度)。比如:父类的private成员被protected继承后仍然是private;父类的public成员被protected继承后就是protected;父类的public成员被public继承后就是public。C++中默认修饰符为private。
对于函数的覆盖(子类中定义与父类完全相同的函数而父类中的函数为非virtual的函数,这叫做函数的子类覆盖)。在C++中,调用一个对象的方法时,默认会以这个对象的Label类型来调用。也就是,当子类对象传入一个以父类指针或父类引用为参数的函数中时,在调用这个对象的方法时,程序会调用的父类的方法,这是和Java的调用实际类型的类的方法是不同的,比如:
class Vehical{
public:
std::string getType(){
return "Vehical";
}
};
class Car:public Vehical{
public:
std::string getType(){
return "Car";
}
};
void printType(Vehical& v){
std::cout<<v.getType()<<std::endl;
}
void printChildType(Car& c){
std::cout<<c.getType()<<std::endl;
}
int main(){
Car c;
printType(c);
printChildType(c);
return 0;
}
打印结果为:
Vehical
Car
也就是程序调用的是printType函数的参数类型Vehical的getType方法,非虚函数的调用与参数指针指向的实际类型无关。
在C++中能够让C++的代码像Java一样按实际类型进行类的方法的调用的实现方法就是虚函数,也就是virtual和override修饰符。在父类中的virtual修饰符表示这是一个可以按实际类型调用实际类型的方法的虚方法。在子类中用相同的方法名和参数定义一个相同的方法,并在方法定义之后加上override关键词,表示此方法必须也必要重写父类的相同的virtual方法。这样,这个类以及子类的这个方法就会像Java一样按实际类型调用实际类型的对应方法了。比如以下代码:
class Vehical{
public:
virtual std::string getType(){
return "Vehical";
}
};
class Car:public Vehical{
public:
std::string getType() override{
return "Car";
}
};
void printType(Vehical& v){
std::cout<<v.getType()<<std::endl;
}
void printChildType(Car& c){
std::cout<<c.getType()<<std::endl;
}
int main(){
Car c;
printType(c);
printChildType(c);
return 0;
}
打印结果为:
Car
Car
也就是程序调用的是指针指向的实际数据类型Car的getType方法。