부모로부터 상속받은 함수가 자신의 목적에 맞지 않을 경우 자식 클래스가 함수를 재정의 할수있다
부모와 자식 클래스는 다음 두개의 지정자를 함수 앞에 붙여 재정의되는 함수라는 것을 표시한다
virtual
- 부모 클래스의 함수 앞에 붙이며 자식 클래스에 의해 재정의될 수 있다는 뜻이다
override
- 자식 클래스의 함수 앞에 붙이며 부모로부터 상속받은 함수와는 다르게 구현한다는 뜻이다

부모가 재정의를 허가해야만 자식이 재정의를 할 수 있으므로 이 두 지정자는 보통 짝을 이루며 사용된다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
 
namespace @override
{
    class Base
    {
        public virtual void Message()
        {
            Console.WriteLine("Base Meassage");
        }
    }
 
    class Derived : Base
    {
        public override void Message()
        {
            Console.WriteLine("Derived Megssage");
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Base B = new Base();
            Derived D = new Derived();
 
            B.Message();
            D.Message();
 
            Base B2 = D;
            B2.Message();
        }
    }
}




- 부모 클래스에 virtual 을 뺴고, 자식 클래스에 override 를 new로 바꾸면 Message는 비가상 메소드가 된다

- 객체가 선언된 타입을 정적 타입
- 실제 가리키고 있는 타입을 동적 타입
- B2의 정적 타입은 Base, 동적 타입은 Derived

Base B2 = D
여기서 Base 타입을 따르면 비가상 함수
여기서 D 타입을 따르면 가상 함수

비가상 메소드 - 항상 호출 객체의 타입, 정적 타입을 따른다
                    - Message가 비가상일때는 B2가 Base로 선언되었으므로 Base의 메소드가 호출
가상 메소드 - 호출 객체가 실제로 가리키고 있는 아팁, 동적 타입을 따른다
                 - Message가 가상일때는 B2가 Base타입이지만 Derived 객체를 가리키고 있으므로 Derived의 메소드가 호출

Posted by 코딩하는 야구쟁이
,