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