多重继承需要访问私有变量

时间:2018-01-08 15:54:27

标签: c++ inheritance virtual

我不知道如何访问私有变量Multiple Inheritance。

在此代码中,我创建了list2env(data.frame(data), envir = .GlobalEnv)

person

通过继承我创建class person { char name[20]; char lname[20]; public: person() {} person(char*n, char*ln); virtual void print(ostream&o); }; person::person(char*n, char*ln) { strcpy_s(name, 20, n); strcpy_s(lname, 20, ln); } void person::print(ostream&o) { o << "name: " << name << " " << "last name: " << lname << endl; } ostream& operator<<(ostream&o, person&p) { p.print(o); return o; } student

teacher

在上一课我使用多重继承来创建教师助理课,但我不知道如何打印class student : public virtual person {friend class ststudent; long str; public: student(char*n, char*ln, long s); void print(ostream&o); }; student::student(char*n, char*ln, long s) :person(n, ln), str(s) {} void student::print(ostream&o) { person::print(o); o << "st_num : " << str << endl; } class teacher : public virtual person { long salary; public: teacher(char*n, char*ln, long s); virtual void print(ostream&o); }; teacher::teacher(char*n, char*ln, long sal) :person(n, ln), salary(sal) {} void teacher::print(ostream&o) { person::print(o); o << "salary : " << salary << endl; } str

salary

我不知道怎么做。我可以在class stteacher :public teacher, public student { public: stteacher(char*n, char*ln, long st, long sa) :student(0, 0, st), teacher(0, 0, sa), person(n, ln) {} virtual void print(ostream&o); }; void stteacher::print(ostream& o) { person::print(o); o << str << salary; } 类中创建两个变量,或者从私有变量到公共变量更改stteacherstr,但我认为我应该使用多重继承来执行此操作。 请帮帮我。

3 个答案:

答案 0 :(得分:1)

任何非会员,非朋友代码都无法访问班级中的私人数据。期。是否使用继承是无关紧要的。

因此,不同类访问该数据的唯一方法是:

  • 提供访问者功能,以便呼叫者可以获取数据。 (如果是公开的,任何人都可以调用它,但如果它是受保护的函数,那么只有派生类才能访问它。)

  • 或者,创建需要访问该类朋友的类。然而,友谊是c ++程序员通常不鼓励的事情,所以这只是真正的最后手段。

  • 将对数据的访问权限更改为公开。 (非常沮丧,因为这完全打败了封装。)

答案 1 :(得分:0)

访问私有变量的模式是创建一个返回该变量的公共函数:

class teacher : public virtual person
{
    long salary;

public:

    teacher(char*n, char*ln, long s);
    virtual void print(ostream&o);
    long get_salary(void){return salary;}
};

然后stteacher :: print的实现将是:

void stteacher::print(ostream& o)
{
    person::print(o);
    o << get_salary();

}

或类似的东西。

答案 2 :(得分:0)

默认情况下,类是私有的,这意味着在指定访问修饰符之前的任何内容都是私有的。

私有方法/局部变量只能由定义它们的类及其友元类访问。在你的情况下,要定义一个朋友课,你应该首先告诉学生和老师什么是stteacher。

C ++从上到下读取你的代码,所以如果你想使用变量/ class / macro / what,你应该在它上面声明它。

在代码中,这看起来像是:

extern class stteacher; //You tell C++ that 'stteacher' is a class

class person {};

class student : public virtual person {
    long str;
    friend class stteacher; //You make stteacher a friend of student
public:
    student(long str) : str(str) {}
};

class teacher : public virtual person {
    long salary;
    friend class stteacher; //You make stteacher a friend of teacher
public:
    teacher(long salary) : salary(salary) {}
};

class stteacher : public student, public teacher {
public:
    stteacher(long str, long salary) : student(str), teacher(salary) {}
    void print() {
        std::cout << "Salary: " << salary << "\nStr: " << str << std::endl;
    }
}

int main() {
    long str = 10, salary = 100;
    stteacher(str, salary).print();
    return 0;
}
  

薪水:100

     

Str:10

虽然这有效,但我建议最好使用更合适的访问修饰符,例如protected。

受保护的东西可以通过定义它的类访问,它是继承它的朋友类和类。

使用受保护的访问修饰符,上面的代码如下所示:     外部阶级教师; //你告诉C ++'stteacher'是一个类

class person {};

class student : public virtual person {
protected: //Can be accessed by it's childs
    long str;
public:
    student(long str) : str(str) {}
};

class teacher : public virtual person {
protected: //Can be accessed by it's childs
    long salary;
public:
    teacher(long salary) : salary(salary) {}
};

class stteacher : public student, public teacher {
public:
    stteacher(long str, long salary) : student(str), teacher(salary) {}
    void print() {
        std::cout << "Salary: " << salary << "\nStr: " << str << std::endl;
    }
}

int main() {
    long str = 10, salary = 100;
    stteacher(str, salary).print();
    return 0;
}
  

薪水:100

     

Str:10