B2024001225 윤지선

2학기 13주차 과제 본문

카테고리 없음

2학기 13주차 과제

윤지선 2024. 11. 25. 15:53

 

시험문제 출제
상속을 받을 때는 protected로 받음.

 

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 는 실행할 때 결정됨. 

실행할 때마다 메모리 할당이 됨.

 

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이라고 붙여주고, 자식은 똑같은 이름의 함수를 기능만 다르게 만든다.

 

C++ 의 cast연산자

#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;
}

시험문제 출제..!

실행결과
안써도 상관 없음