类可以继承,继承的方式多种多样,之前提到过共有继承,即通过public关键字来继承。除此之外还存在另外两种方式来继承,即private和protected。通过不同的方式继承后,类中原本的属性会发生一定的变化,具体如下:
继承方式 | public | private | protected |
---|---|---|---|
public | public | private | protected |
private | private | private | private |
protected | protected | private | protected |
在日常的使用时,最多的是public的继承方式。
具体在使用的时候,不同的属性会造成不同的影响。
· 在类中的时候所有的属性和行为相互之间都是可以直接做访问的,即在类中是没有权限的概念的。但是,在继承后具体化使用的时候会存在权限问题。在具体化时,无法直接访问私有属性和保护属性即private和protected。继承的时候也存在权限问题,私有属性在派生(被继承的过程也叫做派生)类中是无法直接访问的,但是此私有属性在派生类的也是依然存在的。但是保护属性和公有属性在派生类中是可以直接访问的。
如下:
class Animal {
private:
int height;
protected:
int weight;
public:
void showAnimal() {
cout << "height:" << height << " "
<< "weight:" << weight << endl;
}
};
class Dog :public Animal {
public:
void showDog() {
cout << weight << endl;
}
};
int main() {
cout << sizeof(Animal) << endl;
cout << sizeof(Dog) << endl;
return 0;
}
在上述的情况中,Dog类继承了Animal类,但是在Animal中是无法访问height属性的。通过sizeof可以查看类的大小,此时两者的大小是相同的,说明在Dog类中存在了和Animal类中相同的属性。
· 派生类中如果存在和父类相同的函数,但是函数具体内容存在区别时,子类(派生类)中的同名函数叫做对父类同名函数的重写。
重写不会增加新的函数,而是对原先继承过来的函数做出修改。
· 子类(派生类)中的属性对外依然是私有和保护无法直接访问,共有可以直接访问。
· struct和class在C++中都表示类,但是其默认的属性不同。class不直接表明属性,则默认为私有,struct中不写明时则默认为公有