我不知道如何访问私有变量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;
}
类中创建两个变量,或者从私有变量到公共变量更改stteacher
和str
,但我认为我应该使用多重继承来执行此操作。
请帮帮我。
答案 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