/*
4.3 调整基类成员在派生类中的访问属性的其他方法
4.3.1 同名成员
在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相
同,也就是说,派生类可以重新说明与基类成员同名的成员。 如果在派生类中定义了与基类
成员同名的成员,则称派生类成员覆盖了基类的同名成员,在派生类中使用这个名字意味着
访问在派生类中重新说明的成员。为了在派生类中使用基类的同名成员,必须在该成员名
之前加上基类名和作用域标识符“::”,即必须使用下列格式才能访问到基类的同名成员。
基类名::成员名
下面的程序段说明了这个要点:
class X{
public:
inf f();
};
class Y:public X{
public:
int f();
int g();
};
void Y::g(){
f(); //表示访问派生类中的f(),即即被调用的函数是Y::f()
}
对于派生类的对象的访问,也有相同的结论。例如:
Y obj;
obj.f(); //被访问的函数是Y::f()
如果要访问基类中声明的名字,则应使用作用域标识符限定,例如:
obj.X::f(); //被调用的函数是X::f()
*/
// 例4.10 在派生类中定义同名成员。
#include<iostream>
#include<string>
using namespace std;
class Student{
public:
Student(int number1,string name1,float score1){
number = number1;
name = name1;
score = score1;
}
void print(){
cout<<"number:"<<number<<endl;
cout<<"name:"<<name<<endl;
cout<<"score:"<<score<<endl;
}
protected:
int number; //学号
string name; //姓名
float score; //成绩
};
class UStudent:private Student{ //声明私有派生类UStudent
public:
UStudent(int number1,string name1,float score1,string major1):Student(number1,name1,score1){ //定义派生类构造函数时,缀上基类的构造函数
major = major1;
}
void print(){
Student::print();
cout<<"major:"<<major<<endl;
}
private:
string major;
};
int main(){
UStudent stu(22116,"张果老",99,"神仙专业");
stu.print(); //调用的是派生类中的成员函数print
return 0;
}
/*
在本例的基类Student中定义了成员函数print,在派生类UStudent中,重新定义了成
员函数print。在主程序中派生类对象stu调用的是派生类中的成员函数print,为了调用基
类的成员函数print,可以在派生类的成员函数print中调用基类的成员函数print,但必须
在该成员名之前加上基类名和作用域标识符::,即Student::。在面向对象程序设计中,若
要在派生类中对基类继承过来的某些函数功能进行扩充和改造,都可以通过这样的覆盖来
实现。这种覆盖的方法,是对基类成员改造的关键手段,是程序设计中经常使用的方法。
*/
例4.10 在派生类中定义同名成员
最新推荐文章于 2023-06-29 21:18:07 发布