18.8 Virtual base classes

6266 단어 c++_studyc++_study

https://www.learncpp.com/cpp-tutorial/virtual-base-classes/

17.9의 multiple inheritance에서 우리는 diamond problem에 대해서 잠깐 이야기 했었다
이번 섹션에서 우리는 이에 대한 논의를 계속해본다


우리는 위의 관계를 생각하고 있지만
만약 우리가 copier class object를 만든다면

프로그램은 위처럼 인식해
PoweredDevice를 두번 생성할 것이다

Virtual base classes

이를 해결하기 위해 우리는 virtual 키워드를 이용해
virtual base class를 설정해줄 것이다

#include <iostream>

class PoweredDevice
{
public:
    PoweredDevice(int power)
    {
		std::cout << "PoweredDevice: " << power << '\n';
    }
};

class Scanner: virtual public PoweredDevice // note: PoweredDevice is now a virtual base class
{
public:
    Scanner(int scanner, int power)
        : PoweredDevice{ power } // this line is required to create Scanner objects, but ignored in this case
    {
		std::cout << "Scanner: " << scanner << '\n';
    }
};

class Printer: virtual public PoweredDevice // note: PoweredDevice is now a virtual base class
{
public:
    Printer(int printer, int power)
        : PoweredDevice{ power } // this line is required to create Printer objects, but ignored in this case
    {
		std::cout << "Printer: " << printer << '\n';
    }
};

class Copier: public Scanner, public Printer
{
public:
    Copier(int scanner, int printer, int power)
        : PoweredDevice{ power }, // PoweredDevice is constructed here
        Scanner{ scanner, power }, Printer{ printer, power }
    {
    }
};

위와 같이 되었을 때 PoweredDevice의 constructor는 한번만 실행된다
Printer와 Scanner는 virtual public으로 PoweredDevice를 상속받고 있다

자세한 내용은 고급 주제로 생략한다

좋은 웹페이지 즐겨찾기