zoukankan      html  css  js  c++  java
  • 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++引入了虚基类。

  • 相关阅读:
    BeautifulSoup的高级应用 之.parent .parents .next_sibling.previous_sibling.next_siblings.previous_siblings
    zoj 1655 单源最短路 改为比例+最长路
    localstorage
    unix中文件I/O
    TextView超链接
    Linux环境安装phpredis扩展
    可替代google的各种搜索引擎
    otto源代码分析
    8天学通MongoDB——第二天 细说增删查改
    MongoDB (十一) MongoDB 排序文档
  • 原文地址:https://www.cnblogs.com/lbangel/p/3274800.html
Copyright © 2011-2022 走看看