클래스간의 형변환

|
C++
객체간의 형변환
HTMLWriter hw;
DocWriter dw;
hw = dw; //실패
dw = hw; //성공, 부모 객체와 자식 객체에 공통적으로 있는 멤버들이 1:1로 대입된다. dw의 멤버함수가 호출된다.

포인터간의 형변환, 레퍼런스간의 형변환
DocWriter dw;
HTMLWriter* phw = &dw; //실패

HTMLWriter hw;
DocWriter* pdw = hw; //성공, 자식 객체(hw)의 멤버변수가 사용된다. 부모 객체(pdw)의 멤버함수가 호출된다. virtual인 경우 자식 객체의 멤버함수가 사용된다.

업캐스트 & 다운캐스트
HTMLWriter hw;
DocWriter* pdw = &hw; //업캐스트
HTMLWriter* phw = (HTMLWriter*)pdw; //다운캐스트

DocWriter dw;
HTMLWriter* phw = dw; //다운캐스트 안됨
HTMLWriter* phw = (HTMLWriter*)dw; //다운캐스트







Java
인스턴스 변수의 초기화가 가능하다.
부모 클래스의 변수를 사용 (Variable Shadowing)
자식 클래스의 메소드를 사용 (Polymorphism)
class A {
	int x = 1;
	int y = 2;
	
	void disp() {
		System.out.println("A class, " + x);
	}
}

class B extends A {
	int x = 10;
	int y = 20;
	int z;
	
	void disp() {
		System.out.println("B class, " + x);
	}
}

public class PolymorphismTest {
	public static void main(String args[]) {
		//UpCast a.x = 1
		B b = new B();
		A a = b; //A a = (A)b;
		System.out.println(a.x);
		a.disp();
	}
}




기본 매개변수 : 정적 바인딩 (선행 바인딩)
가상 함수 : 동적 바인딩 (지연 바인딩)

상속받은 매개변수는 절대 재정의해서는 안된다. 정적 바인딩이 되므로 부모 클래스의 가상함수에서 정의된 매개변수의 값이 들어간다.


C++
*
생성자나 멤버함수를 통해 멤버변수의 초기화가 가능하다.
인자가 없는 생성자로 생성한 경우, 부모 클래스의 멤버변수, 멤버함수가 사용된다.
인자가 있는 생성자로 생성한 경우, 자식 클래스의 멤버변수, 부모 클래스의 멤버함수가 사용된다.
부모 클래스의 멤버함수 앞에 virtual을 붙이면 자식 클래스의 멤버변수, 멤버함수가 사용된다.

잘못 작성한 경우
class A { int x, y; };
class B : public A { int x, y, z; };
이 경우 A의 x와 B의 x는 서로 다른 멤버변수이다.
B b;
b.x는 B의 x이고, b.A::x가 A의 x이다.
상속받은 멤버변수는 A::x가 된다.


복사 생성자가 작성되어 있으면 복사 생성자 호출시 디폴트 생성자를 호출하지 않는다.
또한 초기화 할 때에만 복사 생성자를 호출할 수 있다.
복사 생성자를 작성하지 않고 사용할 경우 멤버 변수를 1:1로 복사한다.

부모 클래스에 생성자가 여러 개일 경우
자식 클래스에서 각각에 맞는 부모 클래스의 생성자를 호출해 주어야 한다.
그렇지 않으면 부모 클래스의 디폴트 생성자를 호출하게 된다.



-

'diff C++ Java C#' 카테고리의 다른 글

언어별 코드  (0) 2010.08.21
생성자, 상속, 오버라이딩  (0) 2010.08.19
And