B2024001225 윤지선
2학기 13주차 과제 본문
overriding: 가상함수
상속에서 부모 함수가 마음에 안들어서 내가 함수를 만드는 것.
내가 만든 함수를 실행하고 싶으면 overriding라고 함.
오버라이딩 : 가상함수 구현
가상함수는 부모 클래스 내에서 정의된 멤버함수를 자식클래스에서 재정의하고자 할 때 사용
부모 클래스의 멤버함수와 같은 이름의 함수를 자식클래스에서 재정의하여 사용
자식 클래스에서 재정의되는 가상함수는 부모클래스와 함수의 리턴값, 매개변수 개수, 형이 완전히 같아야 함.
오버로딩은 하나의 클래스에서 같은 이름의 함수가 여러 개 나오는 것. 매개변수의 개수와 자료형은 다름.
오버라이딩은 함수 이름, 매개변수, 자료형이 전부 같음.
바인딩(binding)
변수와 함수에 대한 메모리 할당이나 함수 호출이 발생했을 때 실제로 처리해야 하는 명령어들이 결정되는 시점
정적(static) 바인딩, early
- 컴파일시 변수의 위치와 함수가 실행할 명령이 결정되는 경우
- static 변수, overloading
동적(dynamic) 바인딩, late
- 실제 실행할 때(run time) 결정되는 경우
- 지역변수, overriding
#include <iostream>
using std::cout;
void sub();
int main()
{
cout << "start\n";
sub();
sub();
sub();
return 0;
}
void sub()
{
int x=10;
int y=10;
cout<<x<<y<<'\n';
x++;
y++;
}
int x 와 int y 는 실행할 때 결정됨.
실행할 때마다 메모리 할당이 됨.
static는 컴파일 할 때 메모리 할당이 됨.
y는 값을 유지함
static는 컴파일할 때 결정됨. 실행파일에 들어가 있음. 프로그램이 끝나면 사라짐
#include <iostream>
using std::cout;
void sub();
int main()
{
cout << "start\n";
sub();
sub();
sub();
return 0;
}
void sub()
{
int x=10;
//동적 바인딩, run-time시
static int y=10;
//정적 바인딩, y의 초기값은 컴파일시 10으로
//정해지며 실행시에 이 선언문은 실행하지 않음
cout<<x<<y<<'\n';
x++;
y++;
}
변수는 각각 만들어지고 함수는 공유함
#include <iostream>
using std::cout;
class Point{
int x;
int y;
static int count; //선언
public:
Point(){cout<<++count;}
~Point(){cout<<--count;}
};
int Point::count=0; //정의
int main()
{
Point p1,p2,p3;
return 0;
}
부모가 virtual이라고 붙여주고, 자식은 똑같은 이름의 함수를 기능만 다르게 만든다.
#include <iostream>
using namespace std;
int main()
{
int x = 10, y = 4;
cout << x / y << endl;
cout << (double)x / y << endl;
cout << static_cast<double>(x) / y << endl;
return 0;
}
실행 결과 : 2 (줄바꿈) 2.5 (줄바꿈) 2.5
#include <iostream>
using std::cout;
using std::endl;
class Shape {//추상클래스(abstract class)
protected:
double x, y;
public:
virtual double area() { return 0; } //주석처리
// 일반 가상 함수
// virtual double area()=0; //주석 해제
}; // 순수 가상 함수
class Rectangle : public Shape {
private:
double height, width;
public:
Rectangle(double h, double w)
{
height = h; width = w;
}
double area() { return(width * height); }
};
class Triangle : public Shape {
private:
double height, width;
public:
Triangle(double h, double w)
{
height = h; width = w;
}
double area() { return(width * height / 2.0); }
};
int main()
{
Shape ss; // virtual double area()=0;
// 윗줄 주석과 같이 순수 가상함수가 있으면 추상클래스이고
// 추상클래스는 객체(인스턴스)를 만들 수 없음
Shape* p; //포인터 객체는 가능
Rectangle nemo(10.0, 20.0);
Triangle semo(10.0, 20.0);
p = &nemo; //자식의 주소를 부모 포인터에 대입
cout << "네모면적:" << p->area() << endl; //Rectangle::area()
p = &semo;
cout << "세모면적:" << p->area() << endl; //Triangle::area()
return 0;
}
순수 가상함수를 갖는 클래스는 인스턴스를 만들 수 없음.
#include <iostream>
using std::cout;
class Dot
{
public:
virtual void draw() { cout << "Dot::draw()\n"; }
void print() {
cout << "Dot 클래스\n";
draw();
}
};
class Line :public Dot
{
public:
void draw() { cout << "Line\n"; }
/*void draw() { cout << "Dot\n"; }
void print() {
cout << "Dot 클래스\n";
draw();
}*/
};
int main()
{
Line line;
line.print();
return 0;
}
시험문제 출제..!