#220829~
void sub();
int main() {
std::cout << "start\n" << std::endl;
sub();
sub();
sub();
return 0;
}
void sub()
{
int x=10;
//동적 바인딩 runtime시
static int y=10;
//정적 바인딩, y의 초기값은 컴파일시 10으로 정해지며 실행시에 이 선언문은 실행되지 않음
std::cout << x << "," << y << '\n' << std::endl;
x++;
y++;
}
//1010,1011,1012
casting (int -> char로! 등등)
자식 -> 부모로 가는 Up은 문제없고 down은 문제가 있을 수도 있음
이것이 down_casting임
class A
{
public:
virtual int SS(int i) {return (i * 2);}
// 자식아 이 함수가 마음에 들지 않으면 재정의해. 그럼 이 함수는 무시될꺼야
// 그래도 함수명, 리턴형, 매개변수의 개수와 자료형은 같아해/ 기능만 다르게 해
};
class B : public A
{
public:
int SS(int i) {return(i * 3);}
// 부모클래스의 SS함수가 맘에 안들어서 재정의
}
class A
{
public:
// 'virtual' !!!!!!!!!!!!!!!
virtual int SS(int i) {return(i * 2);}
// 바로 위 SS함수를 호출하도록 '컴파일시' 지정됨 (static binding)
int dd(int i) {return(SS(i)*2);}
};
class B : public A
{
public:
int SS(int i) {return(i * 3);} // B에도 dd 와있음
};
int main()
{
B bb;
//부모, 자식 포인터 잘 확인하기
A *pA=new A; // only 부모 포인터
A *pB=new B; // 자식의 주소를 부모클래스가 가지고있음
std::cout << bb.dd(2) << std::endl; // (i*3)*2 =12
std::cout << pA->dd(2) << std::endl; // 8 (부모, 부모)
std::cout << pB->dd(2) << std::endl; // (i*3)*2 = 12
delete pA; delete pB; // new로 할당했을때는 delete로 꼭 삭제
return 0;
}
// 코드 상단에
public: vitual double area()=0;
Rectangle(double h, double w)
{
height=h; width=w;
}
double area() {return(width * height);}
Triangle(double h, double w)
{
height=h; width=w;
}
double area() {return(width * height /2.0);}
// 추상클래스는 객체를 만들 수없지만 포인터 객체는 가능!
shape* p; //포인터 객체는 가능
Rectangle nemo (10.0, 20.0)
Triangle semo (10.0, 20.0)
p = &nemo //자식의 주소를 부모 포인터에 대입
std::cout << "네모면적" << p->area() << std::endl;
p = &semo
std::cout << "세모면적" << p->area() << std::endl;