学习笔记 virtual 关键字(c++)

关于 virtual的一些学习心得
只在声明时使用,类外部定义时不加virtual,特别容易出错
加virtual 为的是;
1.派生类与基类形成动多态时,基类指针调用的是派生类的函数;
2.虚继承,避免派生类和子类出现同名的变量和函数,解决多重继承同一基类的问题,能减少开销,因为不鼓励多重继承,很少用到。
3.虚析构(只关注虚析构请翻到最底部),最常用到。
1.首先理解多态:
A和B都是一年级学生(具有同一特性),听到上课铃声响,A回到1班,B回到了2班,这就是多态的现象。

抽象为:同一动作(同一函数),对于不同的对象产生的行为(执行的操作,产生的结果)不同。

多态的好处:增加程序的灵活性,减轻系统升级,维护和调试的工作量和复杂度

ps:
1.(静多态:函数重载,内部实现Namemangling ,编译期,不在本篇中讨论)
2.父类=基类,子类= 派生类
2.赋值兼容

定义:在需要基类对象的任何地方,都可以用公有派生的对象来替代(默认行为,不需要显示转化)

基类和派生类有同名函数(动多态,不是重载,和重载没有任何关系)
1.派生类对象可以赋值给基类对象;
2. 派生类对象可以初始化基类的引用;
3. 派生类对象的地址可以赋值指向基类的指针。(使用最多,最好选择,无赋值覆盖,浅拷贝)(不要用基类的指针赋值给派生类的指针)

举例:
图形类:shape
圆类 :circle
同名函数:draw();
shape s(1,2);
s.draw(); //输出1,2;
circle c(4,5,6);
s = c;
s.draw(); //输出4,5;
shape & rs = c;
rs.draw();// 输出4,5;
shape * as = &c;(有同名函数时,只能访问基类的函数,基类的数据)
as->draw();// 输出4,5;(调用的是基类的draw,此时还没定义虚函数)

4.动多态(运行阶段)

动多态实现的条件:
1.基类中有虚函数,即共用接口;
2.派生类中覆写(同名同参同返回)基类中的虚函数;
3.通过派生类对象赋值的基类指针,调用共用接口;

还是上一个例子:
图形类:shape 基类
圆类 :circle 派生类
长方形类:rect 派生类
同名覆写虚函数:draw();// 基类定义为virtual 虚函数
shape s(1,2);
s.draw(); //输出1,2;
circle c(4,5,6);
rect r(7,8,9,10,11);
shape *ps;

while(1)
{
	int choice;
	cin>>choice; //输入1或者2
	switch(choice)
	{
		case 1:
			ps = &c;
			break; //ps->draw();  输出4,5;
		case 2:
			ps = &r;//ps->draw();  输出7,8
			break;
	}
}
ps->draw();
return 0;

5.纯虚函数

virtual void draw () = 0;
1.没有实现实体,被初始化为0;
2.纯接口,高度抽像类。 java interface
3.抽象基类,没有对象,不能实例化
4.抽象基类的派生类若无覆写纯虚函数,则该派生类仍然为抽象基类
5.含有虚函数的,析构函数也应该声明为虚函数(防止堆栈析构不完全的问题)

依赖也叫做耦合, 高密度低耦合,降低耦合,依赖倒置。
底层实现,中层抽像,高层不变(调用中层的接口,实现底层功能);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值