📅  最后修改于: 2020-09-25 04:54:30             🧑  作者: Mango
众所周知,继承是OOP的一项功能,它使我们能够从基类创建派生类。派生类继承基类的功能。
假设在派生类和基类中都定义了相同的函数 。现在,如果我们使用派生类的对象调用此函数 ,则将执行派生类的函数 。
这在C++中称为函数重写 。在派生类的函数覆盖在基类的函数 。
// C++ program to demonstrate function overriding
#include
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
输出
Derived Function
在这里,在Base
类和Derived
类中都定义了相同的函数 print()
。
因此,当我们从Derived
对象derived1
调用print()
,通过覆盖Base
的函数来执行Derived
的print()
。
要访问基类的重写函数 ,我们使用范围解析运算符 ::
。
我们还可以通过使用基类的指针指向派生类的对象,然后从该指针调用该函数来访问重写的函数 。
// C++ program to access overridden function
// in main() using the scope resolution operator ::
#include
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1, derived2;
derived1.print();
// access print() function of the Base class
derived2.Base::print();
return 0;
}
输出
Derived Function
Base Function
在这里,这句话
derived2.Base::print();
访问基类的print()
函数 。
// C++ program to call the overridden function
// from a member function of the derived class
#include
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
// call overridden function
Base::print();
}
};
int main() {
Derived derived1;
derived1.print();
return 0;
}
输出
Derived Function
Base Function
在此程序中,我们在Derived
类本身内部调用了重写函数 。
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
Base::print();
}
};
注意代码Base::print();
,它在Derived
类中调用重写的函数 。
// C++ program to access overridden function using pointer
// of Base type that points to an object of Derived class
#include
using namespace std;
class Base {
public:
void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
// pointer of Base type that points to derived1
Base* ptr = &derived1
// call function of Base class using ptr
ptr->print();
return 0;
}
输出
Base Function
在此程序中,我们创建了一个名为ptr
的Base
类型的指针。该指针指向Derived
对象Derived
对象derived1
。
// pointer of Base type that points to derived1
Base* ptr = &derived1
当我们使用ptr
调用print()
函数 ,它将从Base
调用重写的函数 。
// call function of Base class using ptr
ptr->print();
这是因为即使ptr
指向Derived
对象,它实际上也是Base
类型。因此,它调用Base
的成员 函数 。
为了覆盖Base
函数而不是访问它,我们需要在Base
类中使用虚函数。