Inherence

์ „์ฒด์ ์ธ ๊ตฌ์กฐ

์ƒ์†์ด ํ•„์š”ํ•œ ์ด์œ 

์ƒ์†์€ ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค. 13. Class & Object & Constructor ๊ธ€์„ ๋‹ค์‹œ ๊ธฐ์–ตํ•ด๋ณด์ž.

์šฐ๋ฆฌ๊ฐ€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ์‰ฝ๊ฒŒ ๋งํ•ด, ์–ด๋–ค ๋ฌผ์ฒด๋ฅผ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๋Š” ํŒ๋‹จ์ด ๋“ค์–ด์„œ ์ด๋‹ค.

ํ•จ์ˆ˜๋งŒ ๊ฐ€์ง€๊ณ ์„œ ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค๊ธฐ ๋ณด๋‹ค๋Š”, ๋‚ด๊ฐ€ ๋ฌผ๊ฑด์„ ์ •์˜ํ•˜๊ณ  ๊ทธ ๋ฌผ๊ฑด๋“ค์„ ์‹ค์ œ๋กœ ๋งŒ๋“ ๋’ค, ๋ฌผ๊ฑด๋“ค๋กœ ๋‹ค๋ฅธ ํ™œ๋™์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด์ „์— ์‚ฌ์šฉํ–ˆ๋˜ ์‚ฌ์ง„์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•ด๋ณด๋ฉด,

๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ ‡๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ์ฒด๋ฅผ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ดย ํด๋ž˜์Šค, ๊ทธ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ๋Œ€์ƒ์ดย ๊ฐ์ฒด, ์‹ค์ œ๋กœ ๋งŒ๋“ค์–ด์ ธ ๊ตฌ์ฒดํ™” ๋œ ๋ฌผ์ฒด๋ฅผย ์ธ์Šคํ„ด์Šค๋ผ ๋ถ€๋ฅธ๋‹ค.

๊ทธ๋Ÿผ, ์ƒ์†์˜ ๊ฐœ๋…์€ ์™œ ํ•„์š”ํ• ๊นŒ? ์œ„์˜ ํด๋ž˜์Šค ์˜ˆ์‹œ์—์„œ ๋ฆฌ๋ชจ์ปจ ์„ค๊ณ„๋„๋Š” ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

TV ๋ฆฌ๋ชจ์ปจ, ์ฐจ ๋ฆฌ๋ชจ์ปจ, ์—์–ด์ปจ ๋ฆฌ๋ชจ์ปจ.. ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ๋ฆฌ๋ชจ์ปจ์ด ์žˆ์ง€๋งŒ, ์ด๋…€์„์„ ์„ธ์ƒ์— ์กด์žฌํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ฌผ๊ฑด(์ธ์Šคํ„ด์Šค)๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ๊ฐ์ž์— ๋งž๋Š” ์„ค๊ณ„๋„(Class)๊ฐ€ ๋”ฐ๋กœ ํ•„์š”ํ•˜๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋…€์„๋“ค์ด ๊ฐ€์ง€๋Š” ๊ทผ๋ณธ์ ์ธ ํŠน์„ฑ์€ ๋ชจ๋‘ ๋™์ผํ•˜๋‹ค. ์ด ์„ค๊ณ„๋„(Class)๋ฅผ ๋งŒ๋“ค ๋•Œ ์žˆ์–ด์„œ ๋ณด๋‹ค ํฐ ์ง‘ํ•ฉ ๊ฐœ๋…์„ ๋„์ž…ํ•˜๋ฉด ์–ด๋–จ๊นŒ? ๋” ํฐ ํด๋ž˜์Šค์—์„œ ๊ฐ€์ง€๋Š” ํŠน์„ฑ์„ ๋ณ€ํ˜•ํ•ด์„œ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ?

์ด๊ฒƒ์ด ๋ฐ”๋กœย ์ƒ์†ย ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ํŒŒ์ƒ๋œ ๋‹ค๋ฅธ ๋…€์„๋“ค์„ ๋งŒ๋“ค์–ด ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋ถ€๋ชจํด๋ž˜์Šค๋Š” ์ž์‹ํด๋ž˜์Šค์˜ ๋‚ด์šฉ์„ ๋ฐ˜๋“œ์‹œ ๊ฐ€์งˆ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ (A) ์ด๊ณ , ๋ถ€๋ชจํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ํŒŒ์ƒ ํด๋ž˜์Šค๊ฐ€ (Aโ€™) ๋ผ ํ–ˆ์„ ๋•Œ, ๊ฐ๊ฐ์˜ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๊ฐ€ (a, aโ€™)์ด๋ผ ํ•˜๋ฉด, ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ํ•˜๋‚˜๋ฟ์ด๋‹ค.

a = a';		// ๊ฐ€๋Šฅ
a' = a;		// ๋ถˆ๊ฐ€๋Šฅ

์ด๋ ‡๊ฒŒ ๋ถ€๋ชจ๋Š” ์ž์‹์˜ ๋‚ด์šฉ์„ ์ผ๋ถ€ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์—†๋Š” ๋ณ€์ˆ˜๋‚˜, ํ•จ์ˆ˜์— ๊ด€ํ•ด์„œ๋Š” ๋ฌด์‹œํ•˜๊ณ  ์žˆ๋Š” ๊ฐ’๋งŒ ํ• ๋‹น ๋ฐ›์œผ๋ฉด ๋˜์ง€๋งŒ,

์ž์‹ ํด๋ž˜์Šค์— ๋ถ€๋ชจํด๋ž˜์Šค์˜ ๊ฐ’์€ ํ• ๋‹น ํ•  ์ˆ˜ ์—†๋‹ค.

์ž์‹ ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋Š” ๋ถ€๋ชจํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ๊ฐ’์„ ํ• ๋‹น ๋ฐ›์•„์•ผํ•˜๋Š”์ง€ ๋ชจํ˜ธํ•ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Base ์™€ Derived ๊ฐ„ ์ƒ์†๊ด€๊ณ„

Summary

  • Base : Privateย โ†’ ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • Base : Protectedย โ†’ Private
  • Base : Publicย โ†’ ์ƒ์† ํƒ€์ž…์— ๋”ฐ๋ผ ๋ณ€ํ™”!

Example 1

 
#include <iostream>
 
using namespace std;
 
class Base {
public:
    void print_base() { cout << "Base" << endl; }
};
 
class Derived : private Base{ // Base๋ฅผ Private์œผ๋กœ ๋ฐ›์œผ๋‹ˆ,
    						  // ์ด ํด๋ž˜์Šค ๋‚ด์—์„œ๋Š” ๋ชจ๋‘ Private์œผ๋กœ ๋ฐ›๋Š”๋‹ค.
// ๋”ฐ๋ผ์„œ ์ง€๊ธˆ์€ ์ ํ˜€ ์žˆ์ง€ ์•Š์ง€๋งŒ, ์ด ํด๋ž˜์Šค์˜ private๋Š” Base ํด๋ž˜์Šค๊ฐ€
// ๊ฐ€์ง€๋Š” public๋‚ด์˜ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š”๋‹ค.
    
public:
    void print_derived() {
        Base::print_base();	// ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ Base ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
        					// private์ด๋‹ˆ๊นŒ!
        cout << "Derived" << endl; }
};
 
 
int main(){
 
    Base base;
    Derived derived;
 
    base.print_base();
    //derived.print_base();  ์ด ๋ถ€๋ถ„์€ ์—๋Ÿฌ๊ฐ€ ๋œฌ๋‹ค. 
    					 //	Derived ํด๋ž˜์Šค์—์„œ๋Š” print_base ํ•จ์ˆ˜๊ฐ€ Private ์ด๋‹ค.
    derived.print_derived();
 
    return 0;
}
 
 
 
 
Output
Base
Base
Derived
Program ended with exit code: 0

Initialize List์˜ ์ค‘์š”์„ฑ

์ง€๊ธˆ๊นŒ์ง€ ์œ„์—์„œ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š”๋ฐ ์žˆ์–ด ๊ธฐ์กด ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ์†์„ฑ๊ณผ, ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ƒ์†์„ ๋ฐ›๋Š”์ง€์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋จ์„ ๋ฐฐ์› ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ๋ณดํ†ต ์šฐ๋ฆฌ๋Š” ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, Private์— ์ด ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง€๋Š” ๋ณ€์ˆ˜๋“ค์„ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ํŒŒ์ƒํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑ ํ• ๋•Œ, ์ƒ์† ์†์„ฑ์„ Publicย ์œผ๋กœ ์ค€๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, Private์— ์ž‘์„ฑ๋œ ๋…€์„์€ ์‚ฌ์šฉํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  ํŒŒ์ƒ ๋ณ€์ˆ˜๊ฐ€ ๊ธฐ์กด์˜ ํด๋ž˜์Šค๋ฅผ ๋”ฐ์™€์„œ ๊ฐ™์€ ๋ณ€์ˆ˜๋“ค์„ ๋„ฃ์–ด์ค˜์•ผ ํ•จ์—๋„ ๊ทธ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์—†๋‹คย ๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ด ๋•Œ, Initialize List๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ๋‚˜์˜จ๋‹ค. ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž.

Example

#include <iostream>
#include <string>
 
using namespace std;
 
// ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ Public์— ์ •์˜ํ–ˆ๋‹ค.
class Text{
private:
    string text;
public:
    Text(string _t) : text(_t) {}
};
 
// ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ๋ฐ›์•„, ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.
// ์ด ๋•Œ ๋ถ€๋ชจํด๋ž˜์Šค์˜ Private๋Š” ํŒŒ์ƒํด๋ž˜์Šค์—์„œ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
class FancyText: public Text{
private:
    // string text; ์ด ๋ณ€์ˆ˜๋Š” ํŒŒ์ƒํด๋ž˜์Šค์—์„œ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์—†๋‹ค.
    // ํ•˜์ง€๋งŒ ์ƒ์† ๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ณ€์ˆ˜๋Š” ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ๋„ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•  ๊ฒƒ์ด๋‹ค.
    // ๊ทธ๋ ‡๋‹ค๋ฉด ํŒŒ์ƒ ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ, ์ด ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ?
    string left_brac;
    string right_brac;
    string connector;
 
public:
    // ์ •๋‹ต์€ ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, Initialize list๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”๋ฐ,
    // ์‚ฌ์šฉ์ž๋กœ ๋ถ€ํ„ฐ ์ดˆ๊ธฐ๊ฐ’์„ ๋ฐ›์„๋•Œ, ๊ทธ ๊ฐ’์„ initialize list์˜ ์ธ์ž๋กœ ๋„˜๊ฒจ์ค€๋‹ค.
    // ์œ„์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ๋ณด๊ฒŒ๋˜๋ฉด, Public์œผ๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—,
    // ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์ด ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!!
    FancyText(string _t, string _lb, string _rb, string _con):
    Text::Text(_t), left_brac(_lb), right_brac(_rb), connector(_con){
    }
    // Text::Text(_t) ์ด ๋ถ€๋ถ„์ด ๋ถ€๋ชจํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•œ ๋ถ€๋ถ„์ด๋‹ค.
    // ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” private๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์˜ ์†์„ฑ ๋ถ€๋ถ„์„
    // ๊ฐ„์ ‘์ ์œผ๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ์ดˆ๊ธฐํ™”์— ์„ฑ๊ณตํ–ˆ๋‹ค.
};
 
 
class FixedText : public Text{
public:
    FixedText() : Text::Text("FIXED"){}
    // ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์ด initialize list์˜ ์—„์ฒญ๋‚œ ์žฅ์ !!!!
};

function overloading

์ด๋ฆ„๋งŒ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ž๋ฃŒํ˜•, ์ž…๋ ฅ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐฏ์ˆ˜, ์ถœ๋ ฅํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ž๋ฃŒํ˜• ๋“ฑ, ์•„๋ฌด ์ƒ๊ด€์ด ์—†๋‹ค.

ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ๋ณธ์งˆ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‚ด์šฉ์€ ๋™์ผ ํ•  ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ, ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์€,ย ํ•˜๋Š” ํ–‰๋™, ๋ณธ์งˆ(A)์ด ๋™์ผํ•œ ๋…€์„ย ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

๊ฒฐ๊ตญ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋“ค์ดย ์Œ“์ด๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” function overloadingย ์ด๋ผ ํ•œ๋‹ค.

int    sum(int x, int y), 
double sum(double x, double y)
float  sum(float x, float y, float z)

function overriding

ํ•จ์ˆ˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์€ ์ƒ์†์˜ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ์— ํ•ด๋‹น๋˜๋Š”๋ฐ, base ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜๋กœ ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์•„ ๊ตฌ์ฒด์ ์ด๊ฑฐ๋‚˜, ํ˜น์€ ์ด ํด๋ž˜์Šค์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

์ฆ‰,ย ๊ฐ™์€ ์ด๋ฆ„, ๋˜ ๊ฐ™์€ ์ž…๋ ฅํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ›์œผ๋‚˜, ํ•จ์ˆ˜๋‚ด์˜ ์ž‘๋™์— ์žˆ์–ด์„œ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ ์ฒ˜๋Ÿผ (A)์˜ ๋ณธ์งˆ์„ ๋”ฐ๋ฅด๊ธฐ ๋ณด๋‹ค๋Š”,

Aโ€™ ํ˜น์€ Bย ์™€ ๊ฐ™์ด ๋ณ€๊ฒฝ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ƒ์†์„ ๋ฐ›์•„ ์ด๋…€์„์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์›๋ž˜ ํด๋ž˜์Šค์˜ ํ•จ์ˆ˜์— ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๋‚ด์šฉ์„ย ์ถ”๊ฐ€ ํ˜น์€ ์˜ฌ๋ผํƒ€ย ๊ณ  ์žˆ๋‹ค.

๋”ฐ๋ผ์„œย function overridingย ์ด๋‹ค.

Virtual, override

์šฐ๋ฆฌ๋Š” ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ• ๋•Œ, ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ์ž์‹ ํด๋ž˜์Šค๋กœ ๊ฐˆ๋•Œ, ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•ด์ฃผ๊ธฐ ์œ„ํ•ดย Virtualย ์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋‹ค.

๋˜ ์ž์‹ํด๋ž˜์Šค์—์„œ๋Š” ๋ถ€๋ชจํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ ๋ฐ›์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•ด overrideย ๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์‚ฌ์‹ค ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋™ํ•˜๋Š”๋ฐ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ,

  1. ์œ ์ง€๋ณด์ˆ˜
  2. Polymorphism (๋‹คํ˜•์„ฑ)

์„ ์œ„ํ•ด ํ•„์ˆ˜์ ์ด๋‹ˆ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์Šต๊ด€๋“ค์ด์ž.

์†Œ์Šค์ฝ”๋“œ ์ด ์ •๋ฆฌ

#include <iostream>
#include <string>
 
using namespace std;
 
class Text{
private:
    string text;
public:
    Text(string _t) : text(_t) {}
    
    // ์ด ํ•จ์ˆ˜๋Š” ๊ฐ€์ƒ์ด๋ฉฐ, ํŒŒ์ƒํด๋ž˜์Šค์—์„œ ๊ตฌ์ฒดํ™” ๋ ๊ฒƒ์„ ๋ช…์‹œํ•œ๋‹ค.
    virtual string get(){ return text;}
    virtual void append(string _extra) {text += _extra; }
};
 
class FancyText: public Text{
private:
    string left_brac;
    string right_brac;
    string connector;
public:
    FancyText(string _t, string _lb, string _rb, string _con):
    Text::Text(_t), left_brac(_lb), right_brac(_rb), connector(_con){
    }
	
    // ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ๋ถ€ํ„ฐ override ๋œ ํ•จ์ˆ˜์ž„์„ ๋ช…์‹œํ•ด์ค€๋‹ค.
    string get() override { return left_brac + Text::get() + right_brac; }
    void append(string _extra) override{
            Text::append(connector + _extra);
        // ์ด ํ•จ์ˆ˜๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์žˆ์–ด, text = text + connector + _extra;
        // ์ด๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์—†๋‹ค. ๋ถ€๋ชจํด๋ž˜์Šค์˜ text๋Š” private๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
        // ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ๋ถ€๋ชจํด๋ž˜์Šค์— ์ •์˜๋œ public ํŠน์„ฑ์˜ ํ•จ์ˆ˜๋กœ ์ ‘๊ทผํ•ด์„œ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.
        }
};
 
class FixedText : public Text{
 
public:
    FixedText() : Text::Text("FIXED"){}
    void append(string _extra) override{
        // no operation
    }
};
 
 
 
int main(){
 
    Text t1("Plain");
    t1.append("A");
    cout << t1.get() << endl;
 
 
    FancyText t2("Fancy", "<<", ">>", "***");
    t2.append("A");
    cout << t2.get() << endl;
 
    FixedText t3;
    t3.append("A");
    cout << t3.get() << endl;
 
//    t1 = t2; // ์ž์‹ ํด๋ž˜์Šค ๋‚ด์šฉ์€ ๋ถ€๋ชจ์— ๋„ฃ์„ ์ˆ˜ ์ž‡์Œ
//    t2 = t1;    // ๋ฐ˜๋Œ€๋Š” ์•ˆ๋Œ
//    return 0;
//}
Output
PlainA
<<Fancy***A>>
FIXED
Program ended with exit code: 0

Reference