cpp 에서 virtual 로 테스트 해본건 아니라 확인이 필요함
class Parent {
String msg = "Parent 클래스";
public String getMsg() {return msg;}
}
class Child extends Parent {
String msg = "Child 클래스";
public String getMsg(){return msg;}
}
public class OverridingEx {
public static void main(String[] args)
{
// TODO Auto-generated method stub
Child cd = new Child();
System.out.println("cd : " + cd.getMsg());
Parent pt = new Child();
System.out.println("pt : " + pt.getMsg());
Parent ct = new Parent();
System.out.println("ct : " + ct.getMsg());
}
} |
결과는 cpp에서 하던 것과는 좀 다르게
Child() 객체를 Parent의 형으로 변환해주어도 실제 객체는 Parent로 인식하는 것이 아닌 Child로 인식을 한다.
cd : Child 클래스
pt : Child 클래스
ct : Parent 클래스
|
이는 자바의 동적 바인딩(Dynamic binding)으로 인해
객체의 원형을 추적하여 원래 연결되어야 할 메소드를 호출하기 때문이다.
[링크 :
http://slsjyh.blog.me/30111917680]
+
기억이 잘 나지 않아 vs2008/cpp g++/cpp로 포팅 후 돌려보았는데
결과가 다르게 나왔다. 아무래도 타입에 따라서 형을 추적하는 수준에는 자바와 cpp에는 차이가 있어 보인다.
#include < iostream >
#include < string >
using namespace std;
string pmsg = "Parent 클래스";
string cmsg = "Child 클래스";
class Parent {
public:
string getMsg() {return pmsg;}
};
class Child:Parent {
public:
string getMsg() {return cmsg;}
};
class OverridingEx {
public:
static void main()
{
// TODO Auto-generated method stub
Child *cd = new Child();
cout << "cd : " + cd->getMsg() << endl;
//Child *t = new Child();
//Parent *pt = (Parent *)t;
Parent *pt = (Parent *)(new Child());
cout << "pt : " + pt->getMsg() << endl;
Parent *ct = new Parent();
cout << "ct : " + ct->getMsg() << endl;
}
} ;
int main(int argc, char **argv)
{
OverridingEx ex;// = new OverridingEx();
ex.main();
return 0;
}
cd : Child 클래스
pt : Parent 클래스
ct : Parent 클래스 |
하지만 virtual로 가상함수를 만들어 오버로딩 시키면
java와 같이 제대로 동적 바인딩을 통해 실행을 할 수 있다.
class Parent {
public:
virtual string getMsg() {return pmsg;}
};
class Child:Parent {
public:
virtual string getMsg() {return cmsg;}
}; |
cd : Child 클래스
pt : Child 클래스
ct : Parent 클래스 |
+
2013.03.14 추가
동적 바인딩은
인스턴스 변수와 스태틱 메소드에 대해서는 적용되지 않는다.
[링크 :
http://haneulnoon.tistory.com/90]