반응형
암시적 유형 변환(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!
반응형
'C++' 카테고리의 다른 글
[C++] static에 대하여 (0) | 2023.10.30 |
---|---|
[C++] 함수 오버로딩(Function overloading) (0) | 2023.10.29 |
[C++] 얕은 복사(Shallow copy) VS 깊은 복사(Deep copy) (0) | 2023.10.29 |
[C++] call by value/ call by pointer/ call by reference (0) | 2023.10.28 |
[C++] LHS변수와 RHS변수/const 활용(pointer const etc..) (1) | 2023.10.28 |
댓글