פולימורפיזם בC++

zag78

New member
פולימורפיזם בC++

יש לי מחלקה בשםStudent שיורשת ממחלקה בשם Person, כאשר לPerson יש משתנה בשם grade ופונקציה בשם fun.
אם יצרתי מצביע בשם p1 מסוג Person על אובייקט מסוג Stusent, האם יש דרך לגשת דרך המצביע p1 למשתנה grade או לפונקציה fun?
 
כן

p1->grade
p1->fun()zzzz
כמובן, תוך הקפדה על הרשאות גישה...

אגב, זה לא פולימורפיזם.
 

zag78

New member
אז למה זה לא עובד?

צירפתי קוד:


#include<iostream>


class Person
{
private:
int id;

public:
Person()
{
id=5;
}


};

class Student:public Person
{
private:
int grade;
public:

void fun()
{
std::cout<<"I am a student!"<<std::endl;

}


};


void main()
{
Person* p1=new Student;
p1->fun();//why it is a error?


}
 

freak2100

New member
אם ההורשה היא public אז כן

בגדול זה עובד ככה:

class A
{
public:
int i1;
virtual int f1()
{
return 1;
}
int f2()
{
return 1;
}
virtual f3()
{
return 1;
}
protected:
int i2;
private:
int i3;
}
class B : public A
{
public:
virtual int f1()
{
return 2;
}
int f2()
{
// return i3; // Will not work, i3 is private.
return i2; // OK, since i2 is protected
}
}
A a;
B b;
A *ap = new B();
B *bp = new B();
a.i1 = 0; // OK
b.i1 = 0; // OK
ap->i1 = 0; // OK
bp->i1 = 0; // OK
// a.i2 = 0; // Will not work, i2 is protected.
a.f1(); // 1
a.f2(); // 1
a.f3(); // 1
ap->f1(); // 1
ap->f2(); // 1
ap->f3(); // 1
b.f1(); // 2
b.f2(); // i2
b.f3(); // 1
bp->f1(); // 2. f1 is virtual
A::f1(bp); // 1
bp->f2(); // 1, f2 is not virtual
bp->f3(); // 1, f3 is not overrided
 
למעלה