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

Posted

技术标签:

【中文标题】多重继承需要访问私有变量【英文标题】:Multiple Inheritance need to acces to private variable 【发布时间】:2018-01-08 15:54:26 【问题描述】:

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

在这段代码中,我创建了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;

通过继承我创建 studentteacher

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;

在上一堂课中,我使用 Multiple Inheritance 创建教师助理类,但我不知道如何打印 strsalary

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;


我不知道该怎么做。我可以在stteacher 类中创建两个变量,或者将strsalary 从私有变量更改为公共变量,但我认为我应该使用多重继承来做到这一点。 请帮帮我。

【问题讨论】:

您可以将这些变量从private 更改为protected。这与多重继承有什么关系? 避免多重继承。 @Ron:为什么?它会带来一些问题,但如果您有适当的问题,它可以大大简化事情。 虽然通常在外部定义成员函数是一个好主意,但对于 SO 示例,通常值得将它们内联定义 - 它有助于减少代码量。 OT:使用 std:string,而不是 char 数组。 【参考方案1】:

类中的私有数据不能被任何非成员、非好友代码访问。时期。是否使用继承无关紧要。

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

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

或者,使需要访问的班级成为班级的朋友。然而,友谊是 C++ 程序员通常不鼓励的事情,因此只能作为真正的最后手段。

将数据的访问权限更改为公开。 (非常气馁,因为这完全破坏了封装。)

【讨论】:

【参考方案2】:

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

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();


或类似的东西。

【讨论】:

... 或者,如果您只希望派生类可以使用该函数(但不是每个人都可以使用该函数,则可以使该函数受保护。【参考方案3】:

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

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

C++ 从上到下读取你的代码,所以如果你想使用一个变量/类/宏/whatever,你应该在它的使用上面声明它。

在代码中,这看起来像:

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

力量: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

力量:10

【讨论】:

以上是关于多重继承需要访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章

在继承的类中使用私有变量 - Java

extends 继承

子类可以继承父类的一切方法,成员变量,甚至是私有的,但是却不能够访问这些私有的成员变量和方法

接口和抽象类的区别。

2.抽象类和接口的区别

java中抽象类和接口的区别?