다중상속과 다이아몬드 문제

박호준·2021년 9월 12일
0

case 1


class mom{
public : int a = 1;
};

class dad{
public : int a= 2;
};


class child : public mom, public dad
{
public : int c = 1;
};



int main()
{
	child ch;
    std::cout << ch.Mom::a << endl; print 1 
    std::cout << ch.Dad::a << endl; pinrt 2
    std::cout << ch.c << endl; pinrt 3
    
}

case 2


class person{
public : int a;
};

class mom : public person{
public : mom(){a = 1;}
};

class dad : public person{
public : dad{a = 2;}
};


class child : public mom, public dad
{
public : int c = 3;
}



int main()
{
	child ch;
    std::cout << ch.Mom::a << endl; print 1 
    std::cout << ch.Dad::a << endl; pinrt 2
    std::cout << ch.c << endl; pinrt 3
    

case 3


class person{
public : int age;
		void eat(){std::cout << "eating" << endl;}
};

class student : public person{
public : 
	void study(){std::cout << "studying" << endl;}
};

class worker : public person{
public : 
	void  work(){std::cout << "work" << endl;}
};


class Researcher : public student, public worker
{
}



int main()
{
	Researcher re;
	re.student::age = 10;
	re.wordker::age = 20;      // >> 문법적으로 이상함
	re.age = 30 // >> 불가능
    

다이아몬드 문제 발생!!
-> 해결방법 : 가상상속

class student : [virtural] public person{
public : 
	void study(){std::cout << "studying" << endl;}
};

class worker : [virtual] public person{
public : 
	void  work(){std::cout << "work" << endl;}
};
class student : [virtural] public person{
public : 
	void eat();
	void study(){std::cout << "studying" << endl;}
};

class worker : [virtual] public person{
public : 
	void eat();
	void  work(){std::cout << "work" << endl;}
};
// eat에서 문제가 생김
>> 다중상속은 인터페이스로부터 받는다
>> 인터페이스클래스 :  모든 메서드가 순수 가상 함수이고 비정적 멤버 변수가 없는 클래스 (보통 변수명에 I를 붙인다)
>> 추상클래스 : 순수 가상 함수가 하나 이상 들어 있는 클래스
>> 다형적클래스 : 가상함수가 하나 이상 들어 있는 클래스

class IPerson {
	virtual ~Iperson(){}
    virtual void Eat() = 0;
    virtual void getAge() = 0;
};

class IStudent : virtual IPerson{
	virtual void Study() = 0;
}; 
class IWorker : virtual IStudent{
	virtual void Work() = 0 ;
};

class Researcher : IStudent, IWorker {
	void Eat(){
    	std::cout << "Eating" << end;
    }
    void Study(){
    	std::cout << "studying" << endl;
    }
    void Work(){
    	std::cout << "working" << endl;
    }
    int age = 0;
    int getAge = {return age;}
}

profile
hopark

0개의 댓글