系列文章目录
前言
本文带你学习c++类中重要的知识点继承
一、继承方式与权限问题
继承的方式分为两种:派生与继承;
继承:子类中没有产生新的属性或者行为
派生: 派生类中有新的属性和行为产生
其实两者并不必区分的特别清楚;因为在使用时也不会在意我使用的是派升还是继承;
代码实现方式:
class A
{public:
protected:
string aa;
private:
};
class B :public A //因为B类中无新的行为与属性所以为继承
{
public:
protected:
private:
};
class C :public A//因为C类中有新的行为与属性所以为派升
{
public:
protected:
string cc;//新属性
private:
};
继承的实质: 父类的数据和成员子类中有一份
就是说子类可以调用与使用或改变父类的中的数据与函数;但无法直接对私有属性中的数据与函数经行操作但可以在保护属性或公有属性中使用接口的方式访问;
三种继承方式:protected继承 public继承 private继承
public | protected | private | |
---|---|---|---|
protected继承 | protected | protected | 不可直接访问 |
public继承 | public | protected | 不可直接访问 |
private继承 | private | private | 不可直接访问 |
其表意思为继承之后的父类的权限数据在子类中的权限,举个例子:如果采用protected继承 则父类中的公有属性在子类中访问时就为protected属性;
例子:
class A
{public:
int yu;
protected:
string aa;
private:
};
class B :protected A //注意这里是protected继承
{
public:
protected:
private:
};
class C :public A//这里是public继承
{
public:
protected:
private:
};
int main()
{
C c;
B b;
c.yu=0;//可以直接调用
//b.yu = 45;//会发生错误,无法直接调用
return 0;
}
二、继承中的构造函数
-
父类的属性通过父类的构造函数初始化
-
子类中的构造函数,必须要调用父类构造函数,必须采用初始化参数列表的方式
-
单继承和多继承
-
单继承: 只有一个父类
-
多继承: 两个或者两个以上的父类
-
-
继承的属性,无论被继承多少次,所以类一般不会被继承很多层,会导致类的臃肿
这里来一一举例:
class A
{public:
A(int y) :yu(y) {}
int yu;
protected:
string aa;
private:
};
class B
{
public:
B(int i) :yyds(i) {}
protected:
int yyds;
private:
};
class C :public A,public B//这里为多继承
{
public:
C(int u, int i):A(u),B(i) {}//构造C时必须构造其父类,调用父类的构造函数
protected:
private:
};
class D :public C//单继承
{
public:
D(int i, int o, int p) :C(i, o), p(p) {}//因为构造子类时必须要先构造父类所以当继承的层数越多时需要创建时需要的参数也会越来越多造成臃肿
protected:
int p;
private:
};
如果构建子类时不调用其父类的构造函数就是会出错;如不想初始化父类,就要在父类创建一个无参的构造函数;
三、继承中同名问题
当我们遇到父类与子类的数据成员同名时,调用同名变量,优先调用子类中的资源,需要调用父类时需要使用父类的类名限定
例子:
class A
{public:
int yyds;
int yu;
protected:
string aa;
private:
};
class B : public A
{
public:
int yyds;//此处与A中的资源变量名相同
protected:
private:
}
int main()
{
B b;
b.yyds=10;//此处调用的是B类中的yyds;
b.A::yyds=5;//类名限定
cout << b.yyds << endl << b.A::yyds;
return 0;
}
四、构造顺序问题
单继承中的构造顺序问题:在任何时候都是先构造父类后构造子类,
例子:
class A
{public:
A() { cout << "A"; }
protected:
private:};
class B:public A
{public:
B() { cout << "B"; }
protected:
private:};
class C:public B
{
public:
C() { cout << "C"; }
protected:
private:};
int main()
{
C c;//输出为ABC
//如果有析构函数析构顺序会与其相反为CBA
return 0;
}
多继承中构造顺序问题:在遇到多继承时要想到初始化参数列表并不是代表着构造顺序;与构造顺序相关的是类开头时的继承顺序;
例子:
class A
{public:
A() { cout << "A"; }
protected:
private:};
class B
{public:
B() { cout << "B"; }
protected:
private:};
class C
{
public:
C() { cout << "C"; }
protected:
private:};
class D :public B,public A,public C//构造顺序与这里有关,其顺序就是其构造顺序
{
public:
D() { cout << "D"; }
protected:
private:
};
int main()
{
D d;//输出为BACD
return 0;
}
总结
感谢你的观看你的点赞就是对我最大的支持