如何通过定义派生类的构造函数来实例化两个基类的私有数据成员?

Posted

技术标签:

【中文标题】如何通过定义派生类的构造函数来实例化两个基类的私有数据成员?【英文标题】:How can I instantiate private data members of two base classes by defining a constructor of a derived class? 【发布时间】:2014-10-19 06:09:18 【问题描述】:

这是问题陈述:

设计一个名为 Student 的基类。 2 个字段:- (i) 姓名 (ii) Id。派生2类 从学生基类称为运动和考试。类 Sports 有一个名为 s_grade 的字段和 类 Exam 有一个名为 e_grade 的字段,它是整数字段。派生一个名为 Results 的类 它继承自体育和考试。该类有一个字符数组或字符串字段来表示 最终结果。它还有一个名为 display 的成员函数,可用于显示 最后结果。在 main 中说明这些类的用法。

#include<iostream>
#include<string>
using namespace std;

class Student

    string name;
    int id;

    public:
        Student(string n, int a)    name = n; id = a;
        void display()  
        
            cout<<"Student name: "<<name;
            cout<<"\nStudent I.D.: "<<id;
        
;

class Sports : public Student

    int s_grade;

    public:
        Sports(string n, int a,int s):Student(n,a)  s_grade = s;
        void display()  
        
            cout<<"\nSports grade: "<<s_grade;
        
;

class Exam: public Student

    int e_grade;

    public:
        Exam(string n, int a,int e):Student(n,a)    e_grade = e;
        void display()  
           
            cout<<"\Exam grade: "<<e_grade;
        
;

class Results: public Sports, public Exam

    string result;

    public:
        Results(string n,int i, int s, int e):Sports(n,i,s):Exam(n,i,e) 
        void display()
        
            Student::display();
            Sports::display();
            Exam::display();
        
;

这是我的尝试,但存在严重缺陷。

有什么解决办法吗?

非常感谢任何帮助。

【问题讨论】:

1.将字符串作为 const 引用传递。 2. 使用初始化列表。 3.问题是什么 Student::display(); 的调用不应该编译,因为它是模棱两可的:Results 类包含 两个 Student 实例——一个到Sports 和一到Exam @cdhowie 我现在使用虚拟继承来继承Student。它仍然没有编译。我该怎么办? 您知道,这是可怕的 API 设计。请告诉你的老师不要再教坏习惯了。 @EdHeal 我明白了!我使用了一个初始化列表并虚拟地继承了基类。没有错误!谢谢你,干杯! 【参考方案1】:

学生班必须是虚拟的。否则结果将有两个学生成员的副本。这会导致歧义。

【讨论】:

+1,即使它在 cmets 中得到了回答。你需要声誉 类不能是虚拟的——我假设您的意思是 Student 类必须是虚拟继承的 是的,我的意思是 cdhowie。在印度,老师告诉我们,在混合继承中,基类必须是虚拟的。【参考方案2】:

从 Student 类派生 Sports 和 Exam 时,您应该使用虚拟继承。这将确保只为 Results 对象创建一个 Student 实例。

#include<iostream>
#include<string>
using namespace std;

class Student

    string name;
    int id;

    public:
        Student(string n, int a)    name = n; id = a;
        void display()  
        
            cout<<"Student name: "<<name;
            cout<<"\nStudent I.D.: "<<id;
        
;

class Sports : virtual public Student

    int s_grade;

    public:
        Sports(string n, int a,int s):Student(n,a)  s_grade = s;
        void display()  
        
            cout<<"\nSports grade: "<<s_grade;
        
;

class Exam: virtual public Student

    int e_grade;

    public:
        Exam(string n, int a,int e):Student(n,a)    e_grade = e;
        void display()  
           
            cout<<"\Exam grade: "<<e_grade;
        
;

class Results: public Sports, public Exam

    string result;

    public:
        Results(string n,int i, int s, int e):Sports(n,i,s):Exam(n,i,e) 
        void display()
        
            Student::display();
            Sports::display();
            Exam::display();
        
;

【讨论】:

以上是关于如何通过定义派生类的构造函数来实例化两个基类的私有数据成员?的主要内容,如果未能解决你的问题,请参考以下文章

多继承 与 多重继承

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

Typescript派生类和抽象类

虚函数和基类中的this指针的问题!

在其派生类C++的构造函数中调用基类的构造函数[重复]

生成一个派生类对象时,调用基类和派生类构造函数按啥次序