鱼C论坛

 找回密码
 立即注册
查看: 4718|回复: 10

C++多继承还是很困惑,以下程序求帮助。

[复制链接]
发表于 2013-8-20 14:56:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 北回归客 于 2013-8-20 15:03 编辑
  1. #include <IOSTREAM>
  2. #include <STRING>
  3. using namespace std;

  4. class Person{
  5. public:
  6.       Person(string name){
  7.            this->name=name;
  8.       }
  9.       void fun(){cout << "我是一个人类,我的名字叫" << name << endl; }
  10. protected:
  11.     string name;
  12. };

  13. class Teacher:public Person{
  14. public:
  15.      Teacher(string name):Person(name){
  16.          this->name=name;
  17.      }
  18.       void fun(){cout << "我是一个老师,我的名字叫" << name << endl; }
  19. };

  20. class Student:public Person{
  21. public:
  22.        Student(string name):Person(name){
  23.              this->name=name;
  24.        }
  25.        void fun(){cout << "我是一个学生,我的名字叫" << name << endl; }

  26. };

  27. class TeacherStudent:public Teacher,public Student{
  28. public:
  29.      TeacherStudent(string name):Teacher(name),Student(name){          //这里有错误
  30.              this->name=name;
  31.      }
  32.     void fun(){cout << "我是一个助教,我的名字叫" << name << endl; }
  33. };


  34. int main()
  35. {
  36.             Person person("人");
  37.             person.fun();

  38.             Teacher teacher("老师");
  39.             teacher.fun();
  40.             teacher.Person::fun();

  41.             Student student("学生");
  42.             student.fun();
  43.             student.Person::fun();

  44.             TeacherStudent teacherStudent("助教");
  45.             teacherStudent.fun();

  46.             cout<<"程序结束!!!"<<endl;
  47.             return 0;
  48. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-20 15:15:56 | 显示全部楼层
本帖最后由 北回归客 于 2013-8-20 15:17 编辑
  1. #include <IOSTREAM>
  2. #include <STRING>
  3. using namespace std;

  4. class Person{
  5. public:
  6.         Person(string name){
  7.                 this->name=name;
  8.         }

  9.         void fun(){cout << "我是一个人类,我的名字叫" << name << endl; }
  10. protected:
  11.         string name;
  12. };

  13. class Teacher:public Person{
  14. public:
  15.         Teacher(string name,string pname):Person(pname){
  16.                 this->name=name;
  17.         }
  18.         void fun(){cout << "我是一个老师,我的名字叫" << name << endl; }
  19. };

  20. class Student:public Person{
  21. public:
  22.         Student(string name,string pname):Person(pname){
  23.                 this->name=name;
  24.         }
  25.         void fun(){cout << "我是一个学生,我的名字叫" << name << endl; }

  26. };

  27. class TeacherStudent:public Teacher,public Student{
  28. public:
  29.         TeacherStudent(string name,string tname,string sname):Teacher(tname),Student(sname){    //有错误
  30.                 this->name=name;
  31.         }
  32.         void fun(){cout << "我是一个助教,我的名字叫" << name << endl; }
  33. };


  34. int main()
  35. {
  36.         Person person("人");
  37.         person.fun();

  38.         Teacher teacher("老师","人");
  39.         teacher.fun();
  40.         teacher.Person::fun();

  41.         Student student("学生","人");
  42.         student.fun();
  43.         student.Person::fun();

  44.         TeacherStudent teacherStudent("助教","老师","学生");
  45.         teacherStudent.fun();

  46.         cout<<"程序结束!!!"<<endl;
  47.         return 0;
  48. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-20 16:46:33 | 显示全部楼层
应该是这样子:
  1. #include <IOSTREAM>
  2. #include <STRING>
  3. using namespace std;

  4. class Person{
  5. public:
  6.         Person(){};
  7.         Person(string name){
  8.                 this->name=name;
  9.                 cout<<"我是人类构造函数,我的参数是" <<name<<endl;
  10.         }

  11.         void fun(){cout << "我是一个人类函数,我的名字叫" << name << endl; }
  12. protected:
  13.         string name;
  14. };

  15. class Teacher:public Person{
  16. public:
  17.         Teacher(){};
  18.         Teacher(string name,string pname):Person(pname){
  19.                 this->name=name;
  20.         }
  21.         void fun(){cout << "我是一个老师函数,我的名字叫" << name << endl; }
  22. };

  23. class Student:public Person{
  24. public:
  25.         Student(){};
  26.         Student(string name,string pname):Person(pname){
  27.                 this->name=name;
  28.         }
  29.         void fun(){cout << "我是一个学生函数,我的名字叫" << name << endl; }

  30. };

  31. class TeacherStudent:public Teacher,public Student{
  32. public:
  33.         TeacherStudent(string name,string tname,string sname,string pname):Teacher(tname,pname),Student(sname,pname){
  34.                 this->Teacher::name=tname;
  35.                 this->Student::name=sname;
  36.         }
  37.         void fun(){cout << "我是一个助教函数,我的名字叫......" << "有两个name??怎么办??\n一个叫做:" <<Teacher::name<<"\n另一个叫做:" <<Student::name<< endl; }
  38. };

  39. int main()
  40. {
  41.         Person person("人");
  42.         person.fun();

  43.         Teacher teacher("老师","老师人");
  44.         teacher.fun();
  45.         teacher.Person::fun();

  46.         Student student("学生","学生人");
  47.         student.fun();
  48.         student.Person::fun();

  49.         TeacherStudent teacherStudent("助教","老师助教","学生助教","人");
  50.         teacherStudent.fun();
  51.         teacherStudent.Student::fun();
  52.         teacherStudent.Teacher::fun();

  53.         cout<<"程序结束!!!"<<endl;
  54.         return 0;
  55. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-20 16:53:47 | 显示全部楼层
制造孙子同时,要先初始化父亲,还要初始化爷爷
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-20 17:46:46 | 显示全部楼层
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <IOSTREAM>
#include <STRING>
using namespace std;

class Person{
public:
        Person(string name){
                this->name=name;
        }

        void fun(){cout << "我是一个人类,我的名字叫" << name << endl; }
protected:
        string name;
};

class Teacher:public Person{
public:
        Teacher(string pname):Person(pname){

        }
        void fun(){cout << "我是一个老师,我的名字叫" << name << endl; }
};

class Student:public Person{
public:
        Student(string pname):Person(pname){

        }
        void fun(){cout << "我是一个学生,我的名字叫" << name << endl; }

};

class TeacherStudent:public Teacher,public Student{
public:
        TeacherStudent(string tsname):Teacher(tsname),Student(tsname){    //有错误
               
    }
        void fun(){cout << "我是一个助教,我的名字叫" << this->Teacher::name << endl; }
};


int main()
{

        TeacherStudent teacherStudent("小明");
        teacherStudent.fun();

        cout<<"程序结束!!!"<<endl;

                string a;
                cin>>a; //防止一闪而过
        return 0;
}
哈哈,改了下。我觉得名字谁也只有一个吧。所以。。。。  有俩name就只能那样做咯。

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-20 17:47:36 | 显示全部楼层
敢问,你的代码怎么以弄的???我怎么以不会。求教啊。:mad:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-20 17:50:24 | 显示全部楼层
#include <IOSTREAM>

#include <STRING>

using namespace std;


class Person{

public:

      Person(string name){

           this->name=name;

      }

      void fun(){cout << "我是一个人类,我的名字叫" << name << endl; }

protected:

    string name;

};


class Teacher:public Person{

public:

     Teacher(string name):Person(name){

         this->name=name;

     }

      void fun(){cout << "我是一个老师,我的名字叫" << name << endl; }

};


class Student:public Person{

public:

       Student(string name):Person(name){

             this->name=name;

       }

       void fun(){cout << "我是一个学生,我的名字叫" << name << endl; }


};


class TeacherStudent:public Teacher,public Student{

public:

     TeacherStudent(string name):Teacher(name),Student(name){          //这里有错误

             //this->name=name;
                 this->Teacher::name=name;

     }

    //void fun(){cout << "我是一个助教,我的名字叫" << name << endl; }
         void fun(){cout << "我是一个助教,我的名字叫" << Teacher::name << endl; }

};



int main()

{

            Person person("人");

            person.fun();


            Teacher teacher("老师");

            teacher.fun();

            teacher.Person::fun();


            Student student("学生");

            student.fun();

            student.Person::fun();


            TeacherStudent teacherStudent("助教");

            teacherStudent.fun();


            cout<<"程序结束!!!"<<endl;

            return 0;

}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-20 17:51:45 | 显示全部楼层

TeacherStudent对象有两个name成员,一个是Teacher::name,一个是Student::name必须加以指明,若想避免这种情况,要使用虚拟继承
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-21 09:18:46 | 显示全部楼层
具体参考光 版 的回复。我贴张图有助于楼主理解。 class.png
如果是虚拟继承的话,Person类只有一份。楼主搜下菱形继承。

网上资料比较多。建议楼主多搜搜,《Inside The C++ Object Model》可以一看,不过需要基础。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-21 13:51:41 | 显示全部楼层
学到了,多谢谢{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-8-21 15:06:52 | 显示全部楼层
基类出现二意性的是不是应该定义成虚函数~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-5 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表