본문 바로가기
C++

[C++] 객체지향(상속) 타입 캐스팅(Type casting) + 퀴즈문제

by 유노brain 2023. 10. 31.
반응형

암시적 유형 변환(Upcasting)

파생(자식) 클래스 객체의 경우 기본(부모) 클래스 객체를 가리킬 수 있습니다.

파생(자식) 클래스 객체는 암시적(implicitly) 으로 기본(부모) 클래스 객체로 변환될 수 있습니다.

이것을 Upcasting이라고 합니다.

 

아래는 Upcasting 예시코드입니다.

일단은 결과값에 상관하지말고 봐주시면 감사하겠습니다.

#include <iostream>
#include <string>
#include <string.h>

class Car{
    public:
    Car(std::string name) : name_(name){}
    const std::string& name() const {return name_;}
    private:
    std::string name_;
};

class Bus : public Car{
    public:
    Bus(std::string name) : Car(name),money_(0), bus_name_("BBus"){}
    void GetCharge(int charge){ money_ += charge;}
    int money() {return money_;}
    const std::string& name() const {return bus_name_;}
    private:
    int money_;
    const std::string bus_name_;
};


class ConvertibleCar : public Car{
    public:
    ConvertibleCar(std::string name) : Car(name), cost_(0){}
    void openRoof() {roof_.open(this);}
    int cost(){return cost_;}

    private:
    class Roof{
        public:
        void open(ConvertibleCar* car){
                car->cost_ += 100;
        }

    };
    int cost_;
    Roof roof_;


};

void foo(Car* car){}

int main(){
    Car* car = new Car("myCar");
    Bus* bus = new Bus("myBus");
    ConvertibleCar* ccar = new ConvertibleCar("myConv");
    Car* bus_is_car = bus;
    Car* conv_is_car = ccar;

    std::cout<<car->name() <<std::endl;
    std::cout<<bus->name() <<std::endl;
    std::cout<<ccar->name() <<std::endl;
    return 1;
}

위의 코드에서 뜻하는 것은 Car* bus_is_car = bus가 가능하다는 것입니다.

마찬가지로 conv_is_car도 가능합니다.

가능한 이유는 bus와 ConvertibleCar 모두 Car의 자식 클래스이기 때문에 Upcasting이 가능합니다.

 

 

기본적으로 upcasting은 타입-안전(type-safe)입니다.
즉 언어유형 시스템을 망치지 않습니다.

 

C++언어에 upcasting의 경우 부모클래스를 자식 클래스가 public으로 상속받는 경우에만 가능합니다.

 


퀴즈

1. bus->name()에 어떤것이 오는가?
#include <iostream>
#include <string>
#include <string.h>

class Car{
    public:
    Car(std::string name) : name_(name){}
    const std::string& name() const {return name_;}
    private:
    std::string name_;
};

class Bus : public Car{
    public:
    Bus(std::string name) : Car(name),money_(0), bus_name_("BBus"){}
    void GetCharge(int charge){ money_ += charge;}
    int money() {return money_;}
    const std::string& name() const {return bus_name_;}
    private:
    int money_;
    const std::string bus_name_;
};

int main(){
 
    Bus* bus = new Bus("myBus");
    std::cout << bus->name() <<std::endl;
   
    return 1;
}
더보기

BBus

 

 

2. car->name() 어떤것이 오는가?
#include <iostream>
#include <string>
#include <string.h>

class Car{
    public:
    Car(std::string name) : name_(name){}
    const std::string& name() const {return name_;}
    private:
    std::string name_;
};

class Bus : public Car{
    public:
    Bus(std::string name) : Car(name),money_(0), bus_name_("BBus"){}
    void GetCharge(int charge){ money_ += charge;}
    int money() {return money_;}
    const std::string& name() const {return bus_name_;}
    private:
    int money_;
    const std::string bus_name_;
};

int main(){
 
    Car* car = new Bus("myBus");
    std::cout << car->name() <<std::endl;
   
    return 1;
}
더보기

myBus

 

다음 코드가 실행하는지 판단하시오
#include <iostream>
#include <string>
#include <string.h>

class Car{
    public:
    Car(std::string name) : name_(name){}
    const std::string& name() const {return name_;}
    private:
    std::string name_;
};

class Bus : public Car{
    public:
    Bus(std::string name) : Car(name),money_(0), bus_name_("BBus"){}
    void GetCharge(int charge){ money_ += charge;}
    int money() {return money_;}
    const std::string& name() const {return bus_name_;}
    private:
    int money_;
    const std::string bus_name_;
};

int main(){
 
    Car* car = new Bus("myBus");
    std::cout << car->money() <<std::endl;
   
    return 1;
}
더보기

Error!

 

반응형

댓글