C ++을 사용하여 파생 클래스에서 부모 함수를 어떻게 호출합니까? 예를 들어 나는 클래스를 호출했다.parent
, 그리고 클래스 호출child
부모로부터 파생 된 이내에
각 반에는print
기능. 자식의 인쇄 함수 정의에서 부모 인쇄 함수를 호출하고 싶습니다. 이 일을 어떻게 하죠?
나는 명백한 것의 위험을 감수 할 것이다 : 함수를 호출한다. 기본 클래스에 정의되어 있다면 파생 클래스에서 자동으로 사용할 수있다.private
).
파생 클래스에 동일한 시그니처가있는 함수가 있으면 기본 클래스의 이름 뒤에 두 개의 콜론을 추가하여 명확하게 할 수 있습니다base_class::foo(...)
. Java 및 C #과 달리 C ++는아니"기본 클래스"에 대한 키워드를 가지고있다 (super
또는base
) C ++가 지원하기 때문에다중 상속모호함을 초래할 수 있습니다.
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가 같아집니다). 사용자가 수행 한 작업을 인식하지 못하는 사람들로부터 2 ~ 3 가지 추상화 계층 방식이 될 수 있습니다. - Emilio Garavagliausing namespace std
. - JAB
주어진 부모 클래스 지정Parent
및 명명 된 자식 클래스Child
다음과 같이 할 수 있습니다.
class Parent {
public:
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
클래스의 실제 이름이며 키워드가 아닙니다.
parent
부모 클래스의 실제 이름입니다. 부모 클래스가 호출 된 경우widget
, 그러면 당신은 전화 할 것입니다.widget::print(x);
. - Greg Hewgillfoo()
여기에 유사한print()
또는 별도의 함수? 그리고private
기반에서 상속 된 세부 사항을 숨기고, 제공하는 상속public
너를위한 그림자 기능해야 할 것폭로하고 싶습니까? - underscore_d
기본 클래스가 호출되면Base
, 귀하의 기능이 호출됩니다.FooBar()
당신은 그것을 사용하여 직접 전화 할 수 있습니다.Base::FooBar()
void Base::FooBar()
{
printf("in Base\n");
}
void ChildOfBase::FooBar()
{
Base::FooBar();
}
MSVC에는 Microsoft 특정 키워드가 있습니다.__감독자
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
. - Thomas Eding__super
; 나는 대체 제안으로 여기 그것을 언급했다. 개발자는 컴파일러를 알고 그 기능의 장단점을 이해해야합니다. - Andrey
기본 클래스 멤버 함수의 접근 한정자가 public 또는 public 인 경우 파생 클래스에서 기본 클래스의 멤버 함수를 호출 할 수 있습니다. 파생 된 멤버 함수에서 기본 클래스가 아닌 가상 및 가상 멤버 함수를 호출 할 수 있습니다. 프로그램을 참조하십시오.
#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
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();
}
참조 예.