c++ 多重继承

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Teacher//声明类Teacher(教师)
 {public:                                  //公用部分
   Teacher(string nam,int a, string t)      //构造函数
    {name=nam;
     age=a;
     title=t;}
   void display( )                          //输出教师有关数据
     {cout<<"name:"<<name<<endl;
      cout<<"age"<<age<<endl;
      cout<<"title:"<<title<<endl;
     }
  protected:                               //保护部分
    string name;
    int age;
    string title;                          //职称
};
class Student                                //定义类Student(学生)
 {public:
   Student(string nam,char s,float sco)
     {
      name1=nam;
      sex=s;
      score=sco;}                          //构造函数
   void display1( )                        //输出学生有关数据
    {cout<<"name:"<<name1<<endl;
     cout<<"sex:"<<sex<<endl;
     cout<<"score:"<<score<<endl;
    }
  protected:                               //保护部分
   string name1;
   char sex;
   float score;                            //    float score;                            //成绩
 };
class Graduate:public Teacher,public Student   //声明多重继承的派生类
 {public:
   Graduate(string nam,int a,char s, string t,float sco,float w):
        Teacher(nam,a,t),Student(nam,s,sco),wage(w) { }
   void show( )                                      //输出研究生的有关数据
    {cout<<"name:"<<name<<endl;
     cout<<"age:"<<age<<endl;
     cout<<"sex:"<<sex<<endl;
     cout<<"score:"<<score<<endl;
     cout<<"title:"<<title<<endl;
     cout<<"wages:"<<wage<<endl;
     }
  private:
    float wage;                     //工资
 };
int main(int argc,char* argv[])
 {
    Graduate grad1("Wang-li",24,'f',"assistant",89.5,1234.5);
    grad1.show( ); 
    return 0;
}
/*
程序运行结果如下: 
name: Wang-li 
age: 24
sex:f
score: 89.5 
title: assistance
wages: 1234.5    
在两个基类中分别用name和name1来代表姓名,其实这是同一个人的名字,从Graduate类的构造函数
中可以看到总参数表中的参数nam分别传递给两个基类的构造函数,作为基类构造函数的实参。
解决这个问题有一个好方法: 在两个基类中可以都使用同一个数据成员名name,而在show函数中引
用数据成员时指明其作用域,如 cout<<″name:″<<Teacher::name<<endl;这就是惟一的,不致引起二义性,能通过编译,正常运行。
通过这个程序还可以发现一个问题: 在多重继承时,从不同的基类中会继承一些重复的数据。如果有多个基类,问题会更突出。在设计派生类时要细致考虑其数据成员,尽量减少数据冗余。
*/

   多重继承存在二义性,为了消除二义性在访问相同名称的属性时需要加上类名,加以区分。虽然这样可以解决二义性,但是相同的属性出现在多个基类中,为了解决数据冗余,c++引入了虚基类。

原文地址:https://www.cnblogs.com/lbangel/p/3274800.html