继承与面向对象设计
1、如果继承一个基类,派生类重定义或覆写了一些基类成员函数,但是在调用的时候,又希望那部分被覆盖的基类成员函数可被使用,那么就必须为原本会被覆盖的名称引用using的声明式。
class Base
{
private:
int x;
public:
virtual void f1() = 0;
virtual void f1(int);
void f2();
void f2(double);
};
class Derived: public Base
{
public:
using Base::f1;//让Base class内名为f1和f2的所有东西
using Base::f2;//在Derived作用域内都可见(并且public)
virtual void f1();
void f2();
};
//调用时
Derived d;
int x;
d.f1(); //调用Derived::f1
d.f1(x);//调用Base::f1
d.f2();//调用derived::f2
d.f2(x);//调用Base::f2
或者可以使用转交函数
class Base
{
private:
int x;
public:
virtual void f1()=0;
virtual void f1(int);
void f2(double);
};
class Derived: private Base
{
public:
virtual void f1()
{
Base::f1();//此时会去调基类的f1()
}
void f2();
};
注意几个概念:
覆写:派生类函数(重写)基类函数。范围不同,分别位于基类和派生类。它们的函数名相同、参数相同、返回类型相同。
重载:在一个类中制造几个名称相同的成员函数,但是参数形式不同。如果一个重载的函数前有virtual修饰符,这不会影响它的重载身份。
重定义:派生类对基类的成员函数重新定义,它们函数名相同,其他无要求。作用域不同,分别位于基类和派生类。