您的位置:首页 > 编程语言 > C语言/C++

c++的重载、覆盖和隐藏(遮蔽)

2015-12-01 15:06 141 查看
一直以来都没分清楚c++的重载、覆盖和隐藏(遮蔽),今天看书看到这里,还是很头大,于是写下来

1.重载

在同一个类中,或者在顶层函数(与main函数同层)中,如果

(1)函数名字相同

(2)但是函数签名不同

就是函数重载。所谓函数签名,就是函数的名字和参数列表(包括参数类型、个数、出现顺序)在编译期间生成的标识。注意,返回值不是函数签名的部分。

下面代码中,两个function函数就是重载函数

class ClassA {

public:

void function();

void function(int);

};

再如,返回值不同,这样是编译不过去的。因为返回值不是函数签名的一部分,所以两个函数签名相同,自然也不是函数重载了

class ClassA {

public:

void function();

int function();

};

2.覆盖

函数覆盖发生在继承层次之中。覆盖必须满足下面4个条件

(1)发生覆盖的函数必须分别在父类和子类中

(2)子类的成员函数的函数名与父类相同

(3)子类参数个数和类型与父类相同

(4)父类函数必须是虚函数

下面就是函数覆盖的一个例子,ClassA的指针指向ClassB类的对象,调用的是ClassB的函数

class ClassA {

public:

virtual void function();

};

class ClassB : public ClassA {

public: void function();

};

int main() {

ClassA* pa = new ClassB;

pa->function();

}

如果上面没有使用virtual关键字,那么调用的将是ClassA函数

可见,函数覆盖可以实现多态调用

3.隐藏(遮蔽):指子类中具有与父类同名的函数(不管参数列表是否相同),除了函数覆盖的情况

(1)子类的成员函数与父类的这个非虚成员函数有不同的函数签名

(2)子类的虚函数无法覆盖父类的虚函数

就是说,继承层次中,父类与子类的同名函数要么是覆盖要么是隐藏了

第一个例子:

上面的例子中少了virtual关键字的情况,这时候我们说ClassB::function遮蔽了继承而来的ClassA::function。

第二个例子:父类的function有一个int参数,而子类没有参数,是函数隐藏

class ClassA {

public:

void function(int);

};

class ClassB : public ClassA {

public:

void function();

};

第三个例子:父类是虚函数,但子类没有与其相同的函数签名

class ClassA {

public:

virtual void function(int);

};

class ClassB : public ClassA {

public:

void function();

};

总结:

(1)函数重载发生在同一个类或顶层函数中,同名的函数而具有不同的参数列表

(2)函数覆盖发生在继承层次中,该函数在父类中必须是virtual,而子类的该函数必须与父类有相同的参数列表

(3)函数隐藏(遮蔽)发生在继承层次中,父类和子类同名的函数中,不属于函数覆盖的都属于函数隐藏
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: