Jak wywołać rodzicielską funkcję klasy z pochodnej funkcji klasy?
Jak wywołać funkcję rodzica z klasy pochodnej używając C++? Na przykład, mam klasę o nazwie parent
i klasę o nazwie child
, która pochodzi od rodzica. Wewnątrz
każda klasa ma funkcję print
. W definicji funkcji drukowania dziecka chciałbym zadzwonić do funkcji drukowania rodziców. Jak miałbym to zrobić?
6 answers
Podejmę ryzyko stwierdzenia oczywistego: wywołujesz funkcję, jeśli jest zdefiniowana w klasie bazowej, jest ona automatycznie dostępna w klasie pochodnej (chyba że jest to private
).
Jeśli w klasie pochodnej istnieje funkcja o tym samym podpisie, możesz ją disambiguate dodając nazwę klasy bazowej, po której następuje dwa dwukropki base_class::foo(...)
. Należy zauważyć, że w przeciwieństwie do Javy i C#, C++ nie ma słowa kluczowego dla "klasy bazowej" (super
lub base
), ponieważ C++ obsługuje wiele dziedziczenie , które może prowadzić do niejednoznaczności.
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'
}
};
Nawiasem mówiąc, nie można wywodzić bezpośrednio z tej samej klasy dwa razy, ponieważ nie będzie sposobu, aby odnieść się do jednej z klas bazowych nad innymi.
class bottom : public left, public left { // Illegal
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-11 09:48:20
Biorąc pod uwagę klasę rodzica o nazwie Parent
i klasę potomną o nazwie Child
, możesz zrobić coś takiego:
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);
}
Zauważ, że {[1] } jest rzeczywistą nazwą klasy, a nie słowem kluczowym.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-30 15:59:22
Jeśli twoja klasa bazowa jest wywołana Base
, a twoja funkcja jest wywołana FooBar()
możesz wywołać ją bezpośrednio używając Base::FooBar()
void Base::FooBar()
{
printf("in Base\n");
}
void ChildOfBase::FooBar()
{
Base::FooBar();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-31 20:21:01
W MSVC istnieje specyficzne dla Microsoft słowo kluczowe: __super
MSDN: Pozwala jawnie stwierdzić, że wywołujesz implementację klasy bazowej dla funkcji, którą nadpisujesz.
// 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)
}
};
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-26 18:51:57
Jeśli modyfikator dostępu do funkcji członka klasy bazowej jest chroniony lub publiczny, można wywołać funkcję członka klasy bazowej z klasy pochodnej. Wywołanie klasy bazowej nie-wirtualnej i wirtualnej funkcji członka z pochodnej funkcji członka może być wykonane. Proszę zapoznać się z programem.
#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;
}
Wyjście:
$ 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-25 11:16:51
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();
}
Przykład odniesienia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-02 14:07:17