源代码:
<span style="font-size:14px;">#include<iostream> #include<string> using namespace std; class Teacher { protected: Teacher(string nam,double ag,string titl){name=nam;age=ag;title=titl;} void Teacher_cout(); string name; double age; string title; } ; void Teacher::Teacher_cout() { cout<<"name:"<<name<<endl; cout<<"age:"<<age<<endl; cout<<"title:"<<title<<endl; } class Student { protected: Student(string nam,string se,double scor){name1=nam;sex=se;score=scor;} void Student_cout(); string name1; string sex; double score; }; void Student::Student_cout() { cout<<"name:"<<name1<<endl; cout<<"sex:"<<sex<<endl; cout<<"score:"<<score<<endl; } class Graduate:public Teacher,public Student { public: Graduate(string nam,double ag,string titl,string se,double scor,double wag):Teacher(nam,ag,titl),Student(nam,se,scor),wage(wag) { wage=wag; } void Graduate_cout(); private: double wage; }; void Graduate::Graduate_cout() { cout<<"name:"<<name<<endl; cout<<"age:"<<age<<endl; cout<<"title:"<<title<<endl; cout<<"sex:"<<sex<<endl; cout<<"score:"<<score<<endl; cout<<"wage:"<<wage<<endl; } int main() { Graduate p1("wang_Li",24,"f","teacher",90,1200);//初始化的过程应该是这个样子的,Graduate(string nam,double ag,string titl,string se,double scor,double wag) p1.Graduate_cout(); return 0; }</span>运行结果:
总结:
1.这里在此地申明一下,一旦数据设为了private,那么就只有本函数可以用这些数据,在外的函数是不能引用的,这一点已经出现了很多次的误解了;但是别的函数也并不是用不了一个类中的私有数据,比例通过public类的输出函数就可以间接地引用这些private数据;
2.在构造函数的参数表中,用()括起的一般是用逗号隔开,用{ }括起来的一般使用分号隔开;
3.一般的,在一个派生类中都会定义个新的输出函数来满足输出的要求,因为这样可以更加符合编程者的输出要求;另外一方面,假使一个派生类中有多个基类,那么多个基类中的数据其实是有可能重复的,这里就会出现一个二义性的问题;这个二义性问题并不是能够通过重新定义一个输出的函数就可以解决的,它需要的是对同一变量的一个清晰的解释;就比如在这个源代码中,在两个类中分别出现了一个统一的变量名字,但是在这个源代码中其实是为了可以更加简便的输出,故意将这两个名字的变量定义为了不一样,实际上可以定义为一样,因为这两个变量的作用域并不重叠,并没有出现冲突,只不过在后面输出名字的时候就要注意输出一个清楚的名字,假使在这两个类中都将名字定义为name,那么语句cout<<"name"<<name>>endl;这个语句其实是有问题的,编译器是不能通过编译的,因为编译器不知道究竟该输出哪一个类中的name,这个时候的解决办法就是给这个name一个清晰的定义,即声明这个name具体是哪一个类中的name,即: cout<<"name"<<Student::name>>endl;
4.初始化的过程应该是这个样子的,Graduate(string nam,double ag,string titl,string se,double scor,double wag)这个决定了提取的顺序,也就是主函数的p1("wang_Li",24,"f","teacher",90,1200)分别赋给了相应的值,完成了这一步之后,再去根据后面的基类函数构造函数名来执行各基类函数的构造函数,这些构造函数中的值是从这个派生类中提取的并赋给那些相应的值的 ;
5.在多重继承中还有这样的一个规则:基类的同名成员在派生类中会被屏蔽,成为不可见的,或者说是派生类中新增加的成员覆盖了基类中的同名成员,可以理解为派生类的同名成员的优先级比积累中的同名成员的优先级要高;不过这里要注意,这里的同名函数指的是类型相匹配、函数名相同、函数参数相同,其中有一项不符合就视为不是同名,如果只是参数不同则被视为函数的重载;
源代码(证明第5点的源代码):
<span style="font-size:14px;">#include<iostream> #include<string> using namespace std; class Information { public: Information(string nam,string se){name=nam;sex=se;} void Information_cout(); string name; string sex; } ; void Information::Information_cout() { cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } class Information1:public Information { public: Information1(string nam,string se,double ag):Information(nam,se),age(ag){} void Information_cout(); private: double age; }; void Information1::Information_cout() { cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; cout<<"age:"<<age<<endl; } int main() { Information1 p1("Wang_Li","man",21); p1.Information_cout(); return 0; }</span>
运行的是派生类中display()输出函数