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

C++ 多态,虚函数

2015-09-06 23:06 260 查看
虚函数和多态

1.基本概念

如果在类中某个成员函数被定义为虚函数,那么在该类的派送类中如果拥有与基类虚函数函数原型相同的函数同样为虚函数,并且与其基类中的版本构成覆盖关系。

一个指向子类的基类指针或引用子类的基类引用,调用虚函数,若基类的虚函数被子类的覆盖,则调用子类版本而非基类版本,否则调用基类版本,这种语法称为多态。

2.覆盖的条件

成员函数 + 虚函数 + 签名相同

返回基本类型或者对象:必须相同

返回类类型的指针或者引用:允许协变(虚函数之间的返回类型不一样,但存在继承关系,允许返回基类指针或引用)

3.多态的条件

虚函数和覆盖 + 指针(this)/引用

在构造和析构函数中调用自己虚函数没有多态性。

注意:在构造和析构函数中调用自己虚函数没有多态性。根据this的指向,决定调用的版本!!

#include <iostream>
using namespace std;

class Base
{
public:
Base(void)
{
// 基类尚未完成构造,this此刻的指向是基类的。
// 构造函数中调用自己的虚函数不存在多态
foo();
bar();
cout << "Base构造结束" << endl;
}

virtual void foo(void)
{
cout << "Base::foo()" << endl;
}

virtual void bar(void)
{
cout << "Base::bar()" << endl;
}

void func(void)
{
// 虽然func不是虚函数,但是仍然存在this指针,存在多态
cout << "Base::func()" << endl;
// foo函数和bar函数根据this指针的指向,调用对应版本的虚函数
foo();
bar();
}

virtual ~Base(void)
{
// 同理,析构中子类已被析构,this制作仍然指向基类
// 析构函数中同样调用自己的虚函数不存在多态
cout << "Base析构开始" << endl;
foo();
bar();
}
};

class Derive : public  Base
{
public:
virtual void foo(void)
{
cout << "Derive::foo()" << endl;
}
virtual void bar(void)
{
cout << "Derive::bar()" << endl;
}
};

int main(void)
{
Base *p = new Derive();
p->func(); // p指向Derive,则func里的this指针指向Derive,调用的是Derive版本的虚函数
delete p;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: