虚函数与多态

是否构成多态的条件:
1、父类的指针或引用
2、虚函数的重写
是否构成虚函数的条件:
1、有virtual
2、函数完全相同(协变:返回值可以不同,但返回值是父子关系的引用或指针)
#include <iostream>
using namespace std;
//基类
class Person
{
public:
virtual void BuyTickets()
{
cout << "买成人票" << endl;
}
};
//派生类
class Student:public Person
{
public:
virtual void BuyTickets()
{
cout << "买小孩票" << endl;
}
};
void Fun(Person& p)
{
p.BuyTickets();
}
// 构成多态,和类型无关,和对象有关
void Test()
{
Person p;
Student s;
Fun(p);
Fun(s);
}
int main()
{
Test();
system("pause");
return 0;
}
输出:
买成人票
买小孩票
--------------------------------------------------------
去掉基类的virtual
#include <iostream>
using namespace std;
//基类
class Person
{
public:
void BuyTickets()// 去掉virtual,构不成多态,就和类型有关,p是基类的就全部调的是基类
{
cout << "买成人票" << endl;
}
};
//派生类
class Student:public Person
{
public:
virtual void BuyTickets()
{
cout << "买小孩票" << endl;
}
};
输出:
买成人票
买成人票
------------------------------------------------------
去掉子类的virtual
#include <iostream>
using namespace std;
//基类
class Person
{
public:
virtual void BuyTickets()//
{
cout << "买成人票" << endl;
}
};
//派生类
class Student:public Person
{
public:
void BuyTickets()// 只去掉子类的virtual,还是会构成多态,因为子类继承父类,输出和第一次一样
{
cout << "买小孩票" << endl;
}

};

这里总结一个基类和子类加不加virtual的效果:

基类

子类

效果

加virtual

virtual

构成多态,与对象有关

加virtual

不加virtual

构成多态,与对象有关

不加virtual

加virtual

不构成多态,与类型有关

不加virtual

不加virtual

不构成多态,与类型有关

也就是说主要看基类加不加virtual,如果基类加virtual则构成多态,效果和对象有关;如果基类不加virtual则不构成多态,效果和类型有关。

-----------------------------------------------
如果返回值不同:
父类为int,子类为void
class Person
{
public:
virtual int BuyTickets()//
{
cout << "买成人票" << endl;
}
};
//派生类
class Student:public Person
{
public:
virtual void BuyTickets()//
{
cout << "买小孩票" << endl;
}
};
会弹出一个错误:返回类型与重写虚拟函数 "Person::BuyTickets" 的返回类型 "int" 既不相同,也不协变
协变:当返回值不同,但返回值必须构成子类和父类的关系的指针或引用
协变的例子如下所示:
class Person
{
public:
virtual Person* BuyTickets()//
{
cout << "买成人票" << endl;
return this;
}
};
//派生类
class Student:public Person
{
public:
virtual Student*BuyTickets()//
{
cout << "买小孩票" << endl;
return this;
}
};
这里的Person* 和Student*不一定必须是这俩,只要能构成父子关系即可。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值