课上留的一个问题:定义了一个基类和一个派生类,想要从派生类中调用基类得成员函数,两种不同的表达形式是等价的吗
应该用下面这种,指定域。上面的不行,多态性还是会执行子类的print函数
参见题目描述。
回答:
是的,C++中有两种不同的表达形式可以从派生类中调用基类的成员函数。它们分别是:
1.使用作用域运算符(::)直接调用父类函数
使用作用域运算符能够直接调用父类函数。作用域运算符后面紧接着的是父类的类名和函数名,两者之间用双冒号隔开。示例如下:
class A{
public:
void f(){
cout<<"This is function f of A"<<endl;
}
};
class B:public A{
public:
void g(){
A::f(); //调用父类的函数f()
cout<<"This is function g of B"<<endl;
}
};
2.在子类中定义一个覆盖父类函数的新函数,并在新函数里调用父类函数
在子类中定义一个新的和父类函数同名的函数,这样相当于是覆盖了父类函数。在新函数中,我们可以通过调用父类的函数来达到从子类中调用父类成员函数的目的。示例如下:
class A{
public:
void f(){
cout<<"This is function f of A"<<endl;
}
};
class B:public A{
public:
void f(){
A::f(); //调用父类的函数f()
cout<<"This is function f of B"<<endl;
}
};
在上面的例子中,函数f()被子类B覆盖了,但在覆盖的部分,我们又调用了A的f()函数,从而完成了从子类中调用父类函数的目的。
这两种方法等价,它们都可以从派生类中调用基类的成员函数。具体使用哪一种,取决于具体情况而定。
代码如下:
#include <iostream>
using namespace std;
class Base {
public:
void func() {
cout << "This is function func of Base." << endl;
}
};
class Derived : public Base {
public:
void callBaseFunc() {
//方法1:使用作用域运算符(::)直接调用基类函数
Base::func();
//方法2:通过子类函数调用基类函数
func();
}
void func() {
cout << "This is function func of Derived." << endl;
Base::func();
}
};
int main() {
Derived d;
d.callBaseFunc();
return 0;
}