多重继承需要访问私有变量
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;
通过继承我创建 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;
在上一堂课中,我使用 Multiple Inheritance 创建教师助理类,但我不知道如何打印 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;
我不知道该怎么做。我可以在stteacher
类中创建两个变量,或者将str
和salary
从私有变量更改为公共变量,但我认为我应该使用多重继承来做到这一点。
请帮帮我。
【问题讨论】:
您可以将这些变量从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
【讨论】:
以上是关于多重继承需要访问私有变量的主要内容,如果未能解决你的问题,请参考以下文章