C++ 상속 - 다중 상속

진경천·2023년 10월 26일
0

C++

목록 보기
56/90
class BaseA {
public:
	int m = 10;
	void foo(){
		cout << "BaseA" << endl;
	}
};

class BaseB {
public:
	int m = 10;
	void foo() {
		cout << "BaseB" << endl;
	}
};

int main() {
	Derived d;
	d.BaseA::foo();
	cout << d.BaseB::m << endl;

	BaseA& ba = d;
	BaseB* bb = &d;
}

위와 같은 방법으로 에러 해결

다이아몬드 상속

위와 같은 형태로 상속이 되며 가장 하위 클래스인 C는 A인 부모가 2개라고 인식이 된다.

#include <iostream>

using namespace std;

class Base {
public:
	int m = 10;
	Base(int m) : m(m) {
		cout << "Base(" << m << ")" << endl;
	}
};

class BaseA : public Base {
public:
	BaseA() : Base(10) {
		cout << "BaseA" << endl;
	}
};

class BaseB : public Base {
public:
	BaseB() : Base(20) {
		cout << "BaseB" << endl;
	}
};

class Derived : public BaseA, public BaseB {
public:
	Derived() {
		cout << "Derived" << endl;
	}
};

int main() {
	Derived d;
}
  • 실행 결과

    Base(10)
    BaseA
    Base(20)
    BaseB
    Derived

    Base의 생성자를 2번 호출한 것을 알 수 있다.

class BaseA : virtual public Base {
public:
	BaseA() : Base(10) {
		cout << "BaseA" << endl;
	}
};

class BaseB : virtual public Base {
public:
	BaseB() : Base(20) {
		cout << "BaseB" << endl;
	}
};

class Derived : public BaseA, public BaseB {
public:
	Derived() : Base(30) {
		cout << "Derived" << endl;
	}
};

위와 같이 virtual 상속을 이용해 Base의 생성자를 1번만 호출하게 했다.

  • 실행 결과

    Base(30)
    BaseA
    BaseB
    Derived
    30
    30

profile
어중이떠중이

0개의 댓글