1.C++ Virtual 用法

这里只讲语法,因为讲原理比较难。还没有涉及到构造函数。那么就直接上代码了:

// VitualFunction.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream>
#include <vector>using namespace std;
//base class
class Animal{
public:virtual void eat(){cout << "animal eat" << endl;}virtual void die(){cout << "animal die" << endl;}
};class Dog : public Animal{public:void eat(){cout << "dog eat" << endl;Animal::die();//use base class's function}
};class Cat : public Animal{public:void eat(){cout << "cat eat" << endl;}
};class Lion : public Animal{};int _tmain(int argc, _TCHAR* argv[])
{vector<Animal*> someAnimals;someAnimals.push_back(new Animal());someAnimals.push_back(new Dog());someAnimals.push_back(new Cat());someAnimals.push_back(new Lion());for(int i = 0; i < someAnimals.size(); ++i){someAnimals[i]->eat();}system("pause");return 0;
}

我总是觉得C++的这块语法有点不对,因为我是先搞过C#和Java的。当子类重写父类方法时,连个关键词都没有,就重写了。还有调用父类的方法,连个关键词都没有,直接名字加::就调用了,也太不尊重父类了。这可能是C++支持多重继承的语法决定。

2.C#中的virtual用法

using System;
using System.Collections.Generic;using System.Text;namespace VirutalFunctionCShape
{//base class
public class Animal{public virtual void eat(){Console.WriteLine("Animal eat");}public virtual void die(){Console.WriteLine("Animal die");}}public class Dog : Animal{public override void eat(){Console.WriteLine("Dog eat");base.die();}}public class Cat : Animal{public override void eat(){Console.WriteLine("Cat eat");}}public class Lion : Animal{}class Program{static void Main(string[] args){IList<Animal> someAnimals = new List<Animal>();someAnimals.Add(new Animal());someAnimals.Add(new Dog());someAnimals.Add(new Cat());someAnimals.Add(new Lion());foreach (Animal animal in someAnimals){animal.eat();}Console.ReadLine();}}
}

C#中比C++好多了,重写的时候加上了override关键词,调用父类的方法时候加上了base关键词。

3.java 中的 Virtual

import java.util.LinkedList;
import java.util.List;public class Animal {public void eat(){System.out.println("Animal eat");}public void die() {System.out.println("Animal die");}/*** @param args*/public static void main(String[] args) {List<Animal> someAnimals = new LinkedList<Animal>();someAnimals.add(new Animal());someAnimals.add(new Dog());someAnimals.add(new Cat());someAnimals.add(new Lion());for(Animal animal : someAnimals){animal.eat();}}}public class Cat extends Animal{@Overridepublic void eat() {System.out.println("Cat eat");}
}
public class Dog extends Animal{@Overridepublic void eat(){System.out.println("Dog eat");super.die();}
}
public class Lion extends Animal{}

java这里好方便,尼玛所有函数默认就是virtual函数,连个virtual关键词都没有,好了,你们要随便重写你们自己搞。重写的时候加上个@override关键词。好像有时候不用也行,看jdk版本。调用父类方法的关键词是super。还行。

参考:

C++ Virtual Function

C++ 中的Virtual Function (虚函数)相关推荐

  1. C++11学习 virtual(虚函数)的用法

    Virtual虚函数 在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念.因为它充分体现了面向对象思想中的继承和多态性这两大特性,在C++语言里应用极广. 多态性 ...

  2. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  3. C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中

    C++对象内存布局--③测试多继承中派生类的虚函数在哪一张虚函数表中 测试2:证明派生类的虚函数的地址跟第一基类的虚函数地址保存在同一张虚函数表中. 派生类有多少个拥有虚函数的基类,派生类对象就有多少 ...

  4. C++中的继承与虚函数各种概念

    虚继承与一般继承 虚继承和一般的继承不同,一般的继承,在目前大多数的C++编译器实现的对象模型中,派生类对象会直接包含基类对象的字段.而虚继承的情况,派生类对象不会直接包含基类对象的字段,而是通过一个 ...

  5. 为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?

    为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数 构造函数中为什么不能调用虚函数? 第一个理由是概念上的 第二个理由是机械上的. 构造函数不能声明为虚函数的原因是 1 构造 ...

  6. 登录页面添加回车和单击登录事件 jQuery.ajax中的 beforeSend:function () 回调函数【日常记录】

    比较有意思的地方1: 实现如下功能可以两种方法 用jQuery.ajax中的 beforeSend:function () 回调函数:如下(下方有全部代码案例) beforeSend:function ...

  7. C++中virtual(虚函数)的用法

    在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念. 什么是虚函数: 虚函数是指一个类中你希望重载的成员函数 ,当你用一个  基类指针或引用   指向一个继承类对 ...

  8. C++中不能声明为虚函数的有哪些函数

    常见的不不能声明为虚函数的有:普通函数(非成员函数):静态成员函数:内联成员函数:构造函数:友元函数. 1.为什么C++不支持普通函数为虚函数? 普通函数(非成员函数)只能被overload,不能被o ...

  9. C++中为何析构函数总是虚函数?

    问题: 为什么析构函数总是虚函数?如果这是必要的,那么为什么C++不把虚析构函数直接作为默认值? 答案: 编译器总是根据类型来调用类成员函数.但是一个派生类的指针可以安全地转化为一个基类的指针.这样删 ...

最新文章

  1. 编程语言python特点-Python编程语言的优点
  2. Select下拉列表框(添加、删除option)
  3. php ffmpeg
  4. C# const与readonly的用法和区别解析(转)
  5. Android创建项目java报错,创建Android工程时报错:Errors running builder 'Android resource manager' on project '项目...
  6. Spring Data JPA 条件查询 分页查询
  7. spring教程笔记6
  8. C语言实现几何图形绘制
  9. 《白话大数据与机器学习》读书笔记1
  10. 计算机视觉实验四-相机标定
  11. 小米8android p慢,给力 小米8青春版获得Android P更新
  12. IOS 改变导航栏颜色
  13. 返款接口教程,转账到支付宝账户开通方法
  14. m基于matlab的光通信误码率仿真,分别对比了OFDM+BPSK和OFDM+4QAM的误码率和星座图
  15. c++primer 第二章 变量和基本类型
  16. 战网在线更改服务器,战网怎么改地区 战网改地区的具体方法介绍
  17. 【Bugzilla】我按照bugzilla的官方指导进行的安装。(一)
  18. 红米android10参数,红米note9详细参数表_红米note9参数配置详情
  19. 网络入侵检测--Snort软件配置文件snort.conf详解
  20. 读书笔记(八)--多平台IoT

热门文章

  1. Zabbix 服务器性能指标参考(学习笔记十七)
  2. BIEE11G系统数据源账号过期问题(默认安装步骤)
  3. 关于Weex,你想了解的一切都在这里
  4. SSD 下的 MySQL IO 优化
  5. 敏友的【敏捷个人】有感(6): 我的改变从执行力分享开始
  6. [日志]挂在树上的茶壶
  7. 混IT,靠的是能力,不是技能
  8. Vue 单选框与单选框组 组件
  9. 动手做webserver的核心之http解析
  10. haproxy基于cookie实现会话绑定