How to call a parent class function from derived class function?
如何调用C++派生类中的父函数?例如,我有一个名为
我将冒风险说明明显的问题:如果函数是在基类中定义的,那么它将自动在派生类中可用(除非它是
如果派生类中有一个具有相同签名的函数,则可以通过添加基类的名称后跟两个冒号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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' } }; |
顺便说一句,不能直接从同一个类派生两次,因为没有办法引用其中一个基类。
1 2 | class bottom : public left, public left { // Illegal }; |
考虑到名为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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); } |
注意,
如果您的基类被称为
1 2 3 4 5 6 7 8 9 10 | void Base::FooBar() { printf("in Base "); } void ChildOfBase::FooBar() { Base::FooBar(); } |
在MSVC中有一个特定于Microsoft的关键字:
MSDN:允许显式声明正在为要重写的函数调用基类实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | // 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) } }; |
如果基类成员函数的访问修饰符是保护的或公共的,则可以从派生类调用基类的成员函数。可以从派生成员函数调用基类非虚拟成员函数和虚拟成员函数。请参考程序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #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; } |
输出:
1 2 3 4 5 6 7 | $ 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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(); } |
参考示例。