如何从派生类函数调用父类函数?

如何使用C++从派生类调用父函数?例如,我有一个名为parent的类,还有一个名为child的类派生自父类。在 每个类都有一个print函数。在孩子的打印函数的定义中,我想调用父母的打印函数。我该怎么做?

871474 次浏览

给定一个名为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是类的实际名称,而不是关键字。

如果你的基类被称为Base,你的函数被称为FooBar(),你可以直接使用Base::FooBar()调用它

void Base::FooBar()
{
printf("in Base\n");
}


void ChildOfBase::FooBar()
{
Base::FooBar();
}

我将冒着陈述显而易见的风险:您调用该函数,如果它在基类中定义,则它在派生类中自动可用(除非它是private)。

如果派生类中有一个具有相同签名的函数,您可以通过添加基类名称后跟两个冒号base_class::foo(...)来消除它的歧义。您应该注意,与Java和C#不同,没有C++有一个“基类”的关键字(superbase),因为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
};

在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)
}
};

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();
}

参考示例。

如果基类成员函数的访问修饰符是protected或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

使用父范围解析运算符调用父方法。

父::方法()

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
}
};