반응형
오버라이딩이란?
베이스 클래스가 가지고 있는 멤버 메스드를 Derived 클래스에서 새로운 함수로 덮어쓰는 것을 오버라이딩입니다.
즉 베이스 클래스에서 존재하는 메서드를 파생클래스에 재정의하는 것을 오버라이딩이라고 합니다.
베이스클래스의 오버라이딩할 메서드를 virtual로 선언
virtual string toString() {
...
return result;
}
파생클래스에 오버라이딩할 메서드를 다음과 같이 추가:
string toString() override {
string result = Computer::toString() +
"\nScreen size: " + to_string(screenSize) + " inches" +
"\nWeight: " + to_string(weight) + " pounds";
return result;
}
Notebook의 toString() 메서드가 Computer 의 toString() 메서드를 override합니다.
Computer::toString()
이렇게 해주면 해당 클래스가 아닌 컴퓨터클래스 즉 베이스클래스에서 해당 함수를 가져와서 출력을 해주는 것입니다.
virtual 메서드
오버라이딩할 메서드는 virtual 메서드로 선언해주어야 합니다.
생성자와 static 메서드를 제외한 모든 메서드는 virtual 메서드가 될 수 있습니다. 즉 오버라이딩 할 수 있습니다. 파생클래스에서 베이스 클래스의 virtual 메서드를 반드시 오버라이딩 해야 하는 것은 아닙니다.
베이스 클래스에서 virtual로 선언된 메서드는 파생 클래스에서도 virtual 메서드로 간주합니다.
파생클래스 객체의 생성
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Point {
public:
double x, y;
Point() = default;
Point(double a, double b) : x(a), y(b) {}
double dist(Point p) {
return sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
}
};
class Shape {
private:
string shape_type;
public:
Shape() = default;
Shape(string type) : shape_type(type) {}
string get_type() {
return shape_type;
}
virtual void print(ostream& out) {
out << shape_type;
}
};
이것은 계층구조로 되어 있는 것입니다.
Shape를 중점으로 Rect, Circle을 만들 생각입니다.
class Shape이라는 base 클래스를 하나 정리했습니다. shape는 도형이라는 개념을 설명하는 것입니다. shape에 특정한 데이터 멤버를 포함시키기는 애매합니다.
반응형