Как вызвать родительскую функцию из производного класса с помощью С++? Например, у меня есть класс под названием parent
и класс под названием child
, который является производным от родителя. В
каждый класс имеет функцию print
. В определении дочерней функции печати я хотел бы сделать вызов функции печати родителей. Как я могу это сделать?
Как вызвать функцию родительского класса из производной функции класса?
Ответ 1
Я рискну заявить очевидное: вы вызываете функцию, если она определена в базовом классе, она автоматически доступна в производном классе (если только не private
).
Если в производном классе есть функция с той же сигнатурой, вы можете устранить ее, добавив имя базового класса, за которым следуют два двоеточия base_class::foo(...)
. Следует отметить, что в отличие от Java и С#, С++ имеет не ключевое слово для "базового класса" (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
};
Ответ 2
Учитывая родительский класс с именем 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 print method; implicitly passes 'this' to Parent::print
Parent::print(x);
}
Обратите внимание, что Parent
- это фактическое имя класса, а не ключевое слово.
Ответ 3
Если ваш базовый класс называется Base
, и ваша функция называется FooBar()
, вы можете вызвать ее напрямую, используя Base::FooBar()
void Base::FooBar()
{
printf("in Base\n");
}
void ChildOfBase::FooBar()
{
Base::FooBar();
}
Ответ 4
В 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)
}
};
Ответ 5
Если модификатор доступа функции-члена базового класса защищен или открыт, вы можете выполнить функцию-член вызова базового класса из производного класса. Можно вызвать вызов не виртуальной и виртуальной функции-члена базового класса из производной функции-члена. Пожалуйста, обратитесь к программе.
#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
Ответ 6
Вызовите родительский метод с оператором разрешения родительской области.
Родитель :: Способ()
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
}
};
Ответ 7
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();
}
Справочный пример.