C++ 호출 기본 클래스 메서드
이 자습서에서는 C++를 사용하여 자식 클래스에서 부모 클래스 메서드를 호출하는 방법에 대해 설명합니다. 먼저 상속을 빠르게 새로 고칩니다.
나중에 다양한 시나리오 및 관련 문제에서 기본 클래스 메서드 호출에 대해 논의할 것입니다.
C++의 상속
상속은 개체 지향 프로그래밍의 강력한 기능입니다. 상속을 통해 자식 클래스는 부모 클래스의 속성과 기능을 공유할 수 있으므로 OOP에서 재사용이 용이합니다.
상속에서 두 클래스는 부모-자식, 기본 파생 또는 일반화-특수 관계로 알려진 관계가 됩니다. 그러나 부모와 자식 대신 기본 파생 전문 용어가 가장 일반적으로 채택됩니다.
C++의 상속 구문:
class Parent {
..
};
class Child : InheritanceSpecifier Parent {
...
};
파생 클래스를 만들려면 InheritanceSpecifier
뒤에 기본 클래스 이름을 작성해야 합니다. 여기에서 InheritanceSpecifier
는 public
, private
또는 protected
일 수 있습니다.
또한 상속하는 동안 여러 부모 클래스의 이름을 지정하면 상속이 다중
이 될 수 있습니다. 상속 종류에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
간단하게 유지하기 위해 기사 전체에서 공용
상속을 사용할 것입니다. 아래 코드와 같이 하위 클래스 내에서 하위 클래스의 개체를 사용하여 기본 클래스 메서드(private
가 아닌 경우)를 호출할 수 있습니다.
class P {
public:
void pf() { cout << "Parent class function\n"; }
};
class C : public P {
public:
void cf() {
pf();
cout << "Child class function\n";
}
};
int main() {
C cObj;
cObj.cf();
cObj.pf();
return 0;
}
우리는 하위 클래스 C
에서 공개적으로 상속되는 상위 클래스 P
를 만들었습니다. 하위 클래스 C
의 cf()
함수는 기본 메서드 pf()
를 호출합니다.
마찬가지로 드라이버 코드(예: main()
)에서 하위 개체 cObj
는 기본 클래스 메서드를 직접 호출합니다.
출력:
Parent class function
Child class function
Parent class function
위의 예는 하위 클래스 내에서 하위 클래스의 개체를 사용하여 기본 클래스 함수 호출을 이해하는 데 매우 간단합니다.
그러나 더 복잡한 상황에서는 다음 구절에서 설명하는 것처럼 기본 메서드를 호출하는 동안 추가적인 주의가 필요할 수 있습니다.
기본 클래스 메서드 호출 문제
이전 코드 및 출력에서 기본 클래스 메서드를 호출하는 데 문제가 없는 것 같습니다. 그러나 부모와 자식 클래스가 동일한 기능을 가지고 있거나 자식이 동일한 기능을 가진 부모가 둘 이상인 경우와 같은 일부 관련 문제가 발생합니다.
이러한 문제를 하나씩 논의해 봅시다.
부모와 자식은 같은 기능을 가지고 있습니다
부모 클래스와 자식 클래스는 동일한 기능을 가질 수 있으며 경우에 따라 자식 클래스 객체로 부모 클래스 함수를 호출하거나 자식 클래스 내에서 부모 클래스 함수를 호출할 수도 있습니다.
먼저 시나리오를 보여주는 코드를 살펴보겠습니다.
class Parent {
public:
void f() { cout << "Parent class function\n"; }
};
class Child : public Parent {
public:
void f() { cout << "Child class function\n"; }
};
int main() {
Child cObj;
cObj.f();
return 0;
}
출력:
Child class function
여기서 자식 클래스 객체는 (부모가 아닌) 자식 클래스의 f()
함수를 호출합니다. 자식 클래스 개체를 통해 부모의 f()
를 호출하려면 다음 코드와 같이 범위 확인 연산자(::
)와 함께 부모 클래스 이름을 사용해야 합니다.
class Parent {
public:
void f() { cout << "Parent class function\n"; }
};
class Child : public Parent {
public:
void f() { cout << "Child class function\n"; }
};
int main() {
Child cObj;
cObj.Parent::f(); // calling f() of parent class
cObj.f();
return 0;
}
출력:
Parent class function
Child class function
범위 결정 연산자와 함께 부모 클래스 이름을 사용한 main()
함수의 두 번째 줄을 참조하십시오. 이에 따라 출력의 첫 번째 줄에서 부모 클래스의 f()
에 의해 인쇄된 메시지를 볼 수 있습니다.
아래 코드에 설명된 대로 자식 클래스 내에서 기본 클래스 함수를 호출하려면 정확한 구문을 따라야 합니다.
class Parent {
public:
void f() { cout << "Parent class function\n"; }
};
class Child : public Parent {
public:
void f() {
Parent::f();
cout << "Child class function\n";
}
};
int main() {
Child cObj;
cObj.f();
return 0;
}
출력:
Parent class function
Child class function
다중 상속 모호성
기본 클래스 메서드 호출과 관련된 두 번째 문제는 여러(2개 이상) 클래스 부모가 동일한 메서드를 가질 수 있다는 것입니다. 이 경우 컴파일러는 동일한 메서드가 여러 기본 클래스에 존재하기 때문에 메서드를 호출하기 위해 특정 기본 클래스를 선택하는 것을 혼동합니다.
기본 메서드를 호출하기 위해 특정 기본 클래스를 선택하는 동안 컴파일러에 대한 컴파일 타임 모호성을 생성하는 코드를 살펴보겠습니다.
class P1 {
public:
void fun() { cout << "Fun from P1\n"; }
};
class P2 {
public:
void fun() { cout << "Fun from P2\n"; }
};
class C : public P1, public P2 {};
int main() {
C objC;
objC.fun();
return 0;
}
여기에서 클래스 C
는 두 개의 기본 클래스(예: P1
및 P2
)에서 상속되며 두 부모 모두 동일한 서명을 가진 fun()
메서드를 가집니다.
이제 드라이버 코드가 자식 개체(objC
)에 의해 fun()
함수를 호출하면 컴파일러가 올바른 기본 클래스를 선택하는 데 혼란을 줍니다.
컴파일러 메시지를 살펴보겠습니다.
base_class_3.cpp: In function ‘int main()’:
base_class_3.cpp:16:7: error: request for member ‘fun’ is ambiguous
objC.fun();
메시지는 컴파일러가 혼란스럽다는 것을 명확하게 보여줍니다. 다시 말하지만 솔루션은 범위 확인 연산자와 함께 클래스 이름을 사용하는 것과 동일합니다.
코드 및 관련 출력을 참조하십시오.
class P1 {
public:
void fun() { cout << "Fun from P1\n"; }
};
class P2 {
public:
void fun() { cout << "Fun from P2\n"; }
};
class C : public P1, public P2 {};
int main() {
C objC;
objC.P1::fun();
objC.P2::fun();
return 0;
}
출력:
Fun from P1
Fun from P2
main()
의 2행과 3행을 참조하십시오. 여기서 P1
및 P2
클래스 이름은 범위 결정 연산자와 함께 사용됩니다. 결과적으로 출력에서 두 기본 함수의 출력을 볼 수 있습니다.