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 |