C ++를 사용하여 파생 클래스에서 부모 함수를 어떻게 호출합니까? 예를 들어,이라는 클래스 parent
와 child
parent에서 파생 된 클래스 가 있습니다. 각 클래스에는 print
기능이 있습니다. 자녀의 인쇄 기능 정의에서 부모 인쇄 기능을 호출하고 싶습니다. 어떻게하면 되나요?
C ++를 사용하여 파생 클래스에서 부모 함수를 어떻게 호출합니까? 예를 들어,이라는 클래스 parent
와 child
parent에서 파생 된 클래스 가 있습니다. 각 클래스에는 print
기능이 있습니다. 자녀의 인쇄 기능 정의에서 부모 인쇄 기능을 호출하고 싶습니다. 어떻게하면 되나요?
답변:
기본 클래스에 정의 된 함수는 파생 클래스에서 자동으로 사용할 수 있습니다 (이 아닌 경우 private
).
파생 클래스에 동일한 서명을 가진 함수가있는 경우 기본 클래스 이름 뒤에 두 개의 콜론을 추가하여 명확하게 표시 할 수 있습니다 base_class::foo(...)
. Java 및 C #과 달리 C ++에는 "기본 클래스"( 또는 )에 대한 키워드 가 없습니다. C ++은 다중 상속 을 지원하므로 모호함을 유발할 수 있습니다.super
base
class left {
public:
void foo();
};
class right {
public:
void foo();
};
class bottom : public left, public right {
public:
void foo()
{
//base::foo();// ambiguous
left::foo();
right::foo();
// and when foo() is not called for 'this':
bottom b;
b.left::foo(); // calls b.foo() from 'left'
b.right::foo(); // call b.foo() from 'right'
}
};
또한 기본 클래스 중 하나를 다른 클래스보다 참조 할 수있는 방법이 없으므로 동일한 클래스에서 직접 두 번 파생 할 수 없습니다.
class bottom : public left, public left { // Illegal
};
template<class A, class B> class C: public A, public B {};
에서는 코드 사용 방식에 따라 두 가지 유형이 동일 할 수 있습니다 (A와 B를 동일하게 만듭니다). 당신이 한 일을 모르는 누군가의 추상화 계층 방법.
using namespace std
입니다.
이름이 부모 클래스 Parent
이고 이름이 자식 클래스 인 Child
경우 다음과 같이 할 수 있습니다.
class Parent {
public:
virtual void print(int x);
}
class Child : public Parent {
void print(int x) override;
}
void Parent::print(int x) {
// some default behavior
}
void Child::print(int x) {
// use Parent's print method; implicitly passes 'this' to Parent::print
Parent::print(x);
}
참고 Parent
클래스의 실제 이름이 아닌 키워드입니다.
foo()
유사한 여기에 print()
또는 별도의 기능? 그리고 당신은 사용하여 뜻 private
기지에서 상속 숨기기 세부 사항에 상속을하고, 제공하는 public
당신이 일에 대한 기능 그림자 않는 노출 할을?
foo()
유사했다 print()
. print()
이 맥락에서 더 의미가 있다고 생각 되는대로 다시 사용하겠습니다 . 누군가 특정 데이터 유형에 대한 작업 집합을 수행하고 일부 접근자를 노출시키고 print(obj&)
메서드를 갖는 클래스를 만들었다 고 가정 해 봅시다 . 나는 작동하는 새로운 수업이 필요 array-of-obj
하지만 다른 모든 것은 동일합니다. 컴포지션은 많은 중복 코드를 생성합니다. 상속은 print(array-of-obj&)
루프 호출 에서이를 최소화 print(obj&)
하지만 클라이언트 print(obj&)
가 그렇게하는 것은 말이되지 않기 때문에 클라이언트가 호출하는 것을 원하지 않습니다
MSVC에는 다음에 대한 Microsoft 특정 키워드가 있습니다. __super
MSDN : 재정의하는 함수에 대해 기본 클래스 구현을 호출하고 있음을 명시 적으로 지정할 수 있습니다.
// deriv_super.cpp
// compile with: /c
struct B1 {
void mf(int) {}
};
struct B2 {
void mf(short) {}
void mf(char) {}
};
struct D : B1, B2 {
void mf(short) {
__super::mf(1); // Calls B1::mf(int)
__super::mf('s'); // Calls B2::mf(char)
}
};
typdef
부모님과 같은 것을 선호 합니다 super
.
__super
. 대체 제안으로 여기에 언급했습니다. 개발자는 컴파일러를 알고 해당 기능의 장단점을 이해해야합니다.
기본 클래스 멤버 함수의 액세스 수정자가 보호되거나 공개 인 경우 파생 클래스에서 기본 클래스의 멤버 함수를 호출 할 수 있습니다. 파생 멤버 함수에서 기본 클래스 비가 상 및 가상 멤버 함수를 호출 할 수 있습니다. 프로그램을 참조하십시오.
#include<iostream>
using namespace std;
class Parent
{
protected:
virtual void fun(int i)
{
cout<<"Parent::fun functionality write here"<<endl;
}
void fun1(int i)
{
cout<<"Parent::fun1 functionality write here"<<endl;
}
void fun2()
{
cout<<"Parent::fun3 functionality write here"<<endl;
}
};
class Child:public Parent
{
public:
virtual void fun(int i)
{
cout<<"Child::fun partial functionality write here"<<endl;
Parent::fun(++i);
Parent::fun2();
}
void fun1(int i)
{
cout<<"Child::fun1 partial functionality write here"<<endl;
Parent::fun1(++i);
}
};
int main()
{
Child d1;
d1.fun(1);
d1.fun1(2);
return 0;
}
산출:
$ g++ base_function_call_from_derived.cpp
$ ./a.out
Child::fun partial functionality write here
Parent::fun functionality write here
Parent::fun3 functionality write here
Child::fun1 partial functionality write here
Parent::fun1 functionality write here
virtual
!
부모 범위 확인 연산자를 사용하여 부모 메서드를 호출하십시오.
부모 :: method ()
class Primate {
public:
void whatAmI(){
cout << "I am of Primate order";
}
};
class Human : public Primate{
public:
void whatAmI(){
cout << "I am of Human species";
}
void whatIsMyOrder(){
Primate::whatAmI(); // <-- SCOPE RESOLUTION OPERATOR
}
};
struct a{
int x;
struct son{
a* _parent;
void test(){
_parent->x=1; //success
}
}_son;
}_a;
int main(){
_a._son._parent=&_a;
_a._son.test();
}
참조 예.