继承本质是类层次的复用。
创新互联服务项目包括留坝网站建设、留坝网站制作、留坝网页制作以及留坝网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,留坝网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到留坝省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!学生和老师的类中包含Person类的内容。
Print函数也是继承下来的。
上述代码中,Peraon叫父类,也叫基类,Student叫子类也叫派生类。
public叫继承方式,继承方式包括公有保护和继承。
基类中的私有本质是不想被继承。
父类中的私有成员,子类中不能访问。父类中的保护成员,子类可以访问。
但是age在studen类中,就是不能被访问。
基类的私有成员在子类都是不可见。基类的其他成员在子类的访问方式 == Min(成员在基类的访问限定符,继承方式),public >protected >private。
去掉继承方式,class默认是私有继承,子类外部不能访问继承成员,struct默认是公有继承,子类外部能访问继承成员。
子类会先构造父类,然后构造子类,析构时先析构子类,再析构父类。
父类和子类赋值转换。
子类对象 可以赋值给 父类的对象 / 父类的指针 / 父类的引用。
int main()
{
Person p;
Student s;
p=s;
}
其中p=s中间不存在类型转换,没有产生临时变量。
而底下这个i=d会产生临时变量,临时变量是int类型。
所以底下没有const修饰的引用会报错。在前面加上const就好了。
父类 ++后,子类也++
赋指针也行,指针指向子类中的父类部分。
下面这个_num访问的是Student本身的_num
访问父类的话可以指定作用域。
子类和父类有同名成员时,子类隐藏了父类成员。
子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫隐藏,
也叫重定义。
两个fun构成隐藏关系。
构成隐藏关系。
父类和子类函数名相同就构成隐藏。
重载要求必须在同一个作用域。 两个fun不构成重载。
class A
{
public:
void fun()
{
cout<< "A::func()"<< endl;
}
};
class B : public A
{
public:
void fun(int i)
{
cout<< "B::func(int i)->"<< i<< endl;
}
};
void Test()
{
B b;
b.fun(10);
};
如果去掉fun调用时的参数,就会编译报错。
因为两个fun构成隐藏关系,去掉fun的参数,就要访问A中的fun,但因为被隐藏,直接访问不行。
class A
{
public:
void fun()
{
cout<< "A::func()"<< endl;
}
};
class B : public A
{
public:
void fun(int i)
{
cout<< "B::func(int i)->"<< i<< endl;
}
};
void Test()
{
B b;
b.fun();
};
这样改就行了。
建议继承中不要定义同名成员。
为什么调用Student会调用Person中的函数并执行?
子类中,父类成员调用父类构造函数完成初始化。
父类没有默认构造函数会报错。
规定不能在子类初始化列表直接初始化父类成员变量。
必须要调用父类的成员函数。
下面看看拷贝构造。
父类部分调用父类拷贝构造。
而如果是自定义类型,需要我们写个拷贝构造。
我们看到父类中拷贝构造函数参数是父类。
在这里如何找到要拷贝的Person对象?
我们直接传s就可以,
子类传给父类发生了赋值转换。s传的就是Person中的内容。
我们来看看赋值。
我们不写,也会默认调用父类赋值。
显示写就这样写。
但这样运行会报栈溢出错误。
因为这个赋值和父类赋值构成隐藏关系,这里面的operator=(s)调用的是自己,所以会栈溢出。
这样改就好了。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧