virtual 와 상속 속성

C++ 2010. 11. 10. 03:04
virtual와 클래스 상속
#include <iostream>
using namespace std;

class A
{
public:
	A() { cout << "A()" << endl; }
	virtual ~A() { cout << "~A()" << endl; } //virtual가 없으면 "A* b = new B;"시에 ~B()가 호출 안됨.
	virtual void print(void) { cout << "A.print" << endl; }//virtual가 없으면 "A* b = new B;"시에 A.print()가 호출됨.
};
class B : virtual public A	//1. virtual
{
public:
	B() { cout << "B()" << endl; }
	virtual ~B() { cout << "~B()" << endl; }
	virtual void print(void) { cout << "B.print" << endl; }
};
class C : virtual public A	//2. virtual
{
public:
	C() { cout << "C()" << endl; }
	virtual ~C() { cout << "~C()" << endl; }
	virtual void print(void) { cout << "C.print" << endl; }
};
class D : public B, public C //1,2 에서 모두 virtual로 A를 상속하지 않으면 A의 생성자/소멸자가 2번씩 호출됨.
{
public:
	D() { cout << "D()" << endl; }
	~D() { cout << "~D()" << endl; }
	void print(void) { cout << "D.print" << endl; }
};
void main(void)
{
	B* b = new D;
	b->print();

	delete b;
}
class D 에는 virtual를 안썼지만 D도 다른 얘들이 상속한다면 B, C 클래스 상속과 소멸자, print()에 
virtual를 붙여줘야 한다. 
ex) class D : virtual public B, virtual public C
{
 
public:
D() {}
virtual ~D() {}
virtual void print(void) {..}
}
 
부모 클래스가 될 일이 없다면 virtual 하지 마라.
 
 
 
 
 
상속 속성 : public, protected, private
class AA
{
public:
	AA() {}
	~AA() {}
public:
	void mpublic() { cout << "public" << endl; }
protected:
	void mprotected() { cout << "protected" << endl; }
private:
	void mprivate() { cout << "private" << endl; }
};
class AA1 : public AA
{
public:
	AA1() {}
	~AA1() {}
	void test() { mpublic(); mprotected(); }
};
class AA2 : protected AA
{
public:
	AA2() {}
	~AA2() {}
	void test() { mpublic(); mprotected(); }
};
class AA3 : private AA
{
public:
	AA3() {}
	~AA3() {}
	void test() { mpublic(); mprotected(); }
};
void main(void)
{
	AA1* aa1 = new AA1;
	aa1->mpublic();
	//aa1->mprotected(); //error
	//aa1->mprivate(); //error
	aa1->test();

	AA2* aa2 = new AA2;
	//aa2->mpublic(); //error
	//aa2->mprotected(); //error
	//aa2->mprivate(); //error
	aa2->test();

	AA3* aa3 = new AA3;
	//aa3->mpublic(); //error
	//aa3->mprotected(); //error
	//aa3->mprivate(); //error
	aa3->test();

	delete aa1;
	delete aa2;
	delete aa3;
}​

 
상속시 접근 권한이 변경됨.
public : 부모의 public/protected를 그래로 상속받음.
protected : 부모의 public/protected를 protected 속성으로 상속받음.
private : 부모의 public/protected를 private   속성으로 상속받음.
private 상속은 Child를 Parent로 변환시키지 않는다.
즉, function(Parent& parent) 에 Child 클래스를 넘겨주면 에러가 발생한다.
 
**.부모의 private는 항상 접근 불가.
 
 

'C++' 카테고리의 다른 글

윈도우 서비스 (service)  (0) 2010.11.25
performance counter (성능 모니터링)  (0) 2010.11.25
MiniDump (미니 덤프 생성하기)  (0) 2010.11.13
Memory Pool (메모리 풀)  (1) 2010.11.13
stable priority queue  (0) 2010.11.08
log4cxx  (0) 2010.11.06
Singleton (싱글톤)  (0) 2010.11.05
Win32 메모리 누수(Leak) 체크  (1) 2010.11.04