classBase{// (4) 부모 클래스의 생성자 호출protectedBase(){// (5) 가상 함수 호출VFunc();// 무엇이 출력될까? 정답은 Set by initializer!// 만약 VFunc()가 abstract 메서드라면 -> 똑같이 Set by initializer!}protectedvirtualvoidVFunc(){Console.WriteLine("VFunc in Base");}}classDerived:Base{// (3) Derived의 멤버 초기화readonlystringmsg="Set by initializer";// (2) Derived 생성자 호출publicDerived(stringmsg){// (마지막) 생성이 완료된 후에 생성자의 스코프 안으로 진입this.msg=msg;}// (6) 가상 함수 실행protectedoverridevoidVFunc(){Console.WriteLine(msg);}}classMain{publicvoidRun(){// (1) Derived 객체 생성 vard=newDerived("Constructed in main");}}
혹시 C++은 어떨까?
#include<iostream>classBase{protected:// (3) 부모 클래스의 생성자 호출
Base(){// (4) 가상 함수 호출
VFunc();// 무엇이 출력될까? 정답은 VFunc in Base!
// 만약 VFunc()가 순수 가상 함수라면 -> 컴파일 에러가 발생한다!
}// (5) 가상 함수 실행
virtualvoidVFunc(){std::cout<<"VFunc in Base"<<std::endl;}};classDerived:publicBase{private:// (6) Derived의 멤버 초기화
std::stringmsg="Set by initializer";public:// (2) Derived 생성자 호출
Derived(conststd::string&msg){// (마지막) 생성이 완료된 후에 생성자의 스코프 안으로 진입
this->msg=msg;}protected:virtualvoidVFunc()override{std::cout<<msg<<std::endl;}};intmain(){// (1) Derived 객체 생성
auto*d=newDerived("Constructed in main");}