大家好,这里是小张,今天给大家带来的是C++类的继承终极篇,今天小张会把剩下的类的继承内容全部说完,希望能够帮助到大家。
另外这里小张给大家推荐一款什么阶段都适用的在校刷题神器以及可以模拟大厂面试的超好用神器 点击这里进入刷题神器
首先先来说说在继承中同名成员的处理方式:如果是访问子类同名成员,直接访问就好,如果要是访问父类的同名成员,需要加作用域(::),详情见以下代码:
//继承同名成员的处理方式
//访问子类同名成员,直接访问就好
//访问父类的同名成员,需要加作用域
#include<iostream>
using namespace std;
class Base//父类
{
public:
int m_A;
Base()
{
m_A = 10;//运用构造函数对类中成员进行初始化
}
};
class son :public Base//用子类继承父类(公共继承的方式)
{
public:
int m_A = 100;//此时与父类中的公共成员同名
};
void test1()//测试案例一,看看此时是输出父类的m_A还是子类的m_A
{
son p;//父类类型的p
cout << "son的m_A=" << p.m_A << endl;
}
int main()
{
test1();
return 0;
}
那么此时结果会是父类中的10,还是会是子类中的100呢,我们来运行下看下结果:
答案是子类中的100,为什么呢,是因为我们在调用m_A的时候如果不加入作用域,我们的编译器会默认为我们想访问的是子类中的m_A,如果我们此时访问的时候加上作用域(::),编译器就会知道我们此时想访问的到底是哪一个类中的m_A。
下面我们来看一下将作用域(::)加上的代码:
#include<iostream>
using namespace std;
class Base//父类
{
public:
int m_A;
Base()
{
m_A = 10;//运用构造函数对类中成员进行初始化
}
};
class son :public Base//用子类继承父类(公共继承的方式)
{
public:
int m_A = 100;//此时与父类中的公共成员同名
};
void test1()//测试案例一,看看此时是输出父类的m_A还是子类的m_A
{
son p;//父类类型的p
cout << "son的m_A=" << p.Base::m_A << endl;
}
int main()
{
test1();
return 0;
}
加上作用域后结果就变成了父类中的10,所以以后要是我们想要调用不同类中的 同名成员的时候我们只需加上该类的类名以及作用域(::)就可以进行访问。
同理,同名函数也是这样的调用规则,下面我们用代码进行演示:
#include<iostream>
using namespace std;
class Base//父类
{
public:
int m_A;
Base()
{
m_A = 10;//运用构造函数对类中成员进行初始化
}
void func()
{
cout << "Base下func函数的调用" << endl;
}
};
class son :public Base//用子类继承父类(公共继承的方式)
{
public:
int m_A = 100;//此时与父类中的公共成员同名
void func()
{
cout << "son下func函数的调用" << endl;
}
};
void test2()//测试案例二,看看此时是输出父类的函数func()还是子类的函数func()
{
son p;//父类类型的p
p.Base::func();//调用父类中的函数func()
}
int main()
{
test1();
return 0;
}
结果跟我们预期的一样,现在我们对这个同名成员以及同名函数有了一定的认识,现在我们来进行小结一下, 如果子类出现和父类同名的成员或者成员函数,子类的同名成员或者成员函数会隐藏掉父类中所有的成员函数,如果想访问到父类中被隐藏的成员函数,这时候就需要加作用域(::)。
到这里我们就把继承中同名的处理说完了,接下来我们来说说多继承的语法 :C++允许一个类继承多个类(一个儿子可以认多个爹)语法:class 子类:继承方式 父类1,继承方式 父类2......
下面由代码实现:
#include<iostream>
using namespace std;
class Base1//父类(第一个父亲)
{
public:
int m_A;
Base1()
{
m_A = 100;
}
};
class Base2//父类(第二个父亲)
{
public:
int m_B;
int m_A;
Base2()
{
m_B = 200;
m_A = 600;
}
};
class son :public Base1, public Base2//子类,此时子类既继承Base1也继承Base2
{
public:
int m_C;
int m_D;
son()
{
m_C = 300;
m_D = 400;
}
};
void test03()//测试案例三
{
son p;
cout<<p.m_B<<endl;
cout<<p.Base::m_A<<endl;//若此时出现了同名成员,依然通过作用域来进行区分
//在子类p中既可以访问到m_A的值,也可以访问到m_B的值,此时实现了多继承
}
int main()
{
test03();
return 0;
}
结果如上 ,到了这里就已经把c++中类的继承的问题全部讲解完成了,非常希望我的这个博客可以为正在学习c++的朋友们带来帮助。同时也希望大家能够多多支持支持小张,你们的支持是小张最大的动力,小张在这里感谢大家啦!