多态——virtual

作用:解决当使用基类的指针指向派生类的对象并调用派生类中与基类同名的成员函数时会出错(只能访问到基类中的同名的成员函数)的问题,从而实现运行过程的多态

不加virtual

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4
 5 class Base {
 6 private:
 7     int mA;
 8     int mB;
 9 public:
10     Base(int a, int b)
11     {
12         mA = a;
13         mB = b;
14     }
15     void ShowMem()
16     {
17         cout << mA << "  " << mB << endl;
18     }
19 };
20
21 class Derived:public Base {
22 private:
23     int mA;
24     int mB;
25     int mC;
26 public:
27     Derived(int a, int b, int c):Base(a,b)
28     {
29         mA = a;
30         mB = b;
31         mC = c;
32     }
33     void ShowMem()
34     {
35         cout << mA << "  " << mB << "  " << mC << endl;
36     }
37 };
38
39 void test(Base &temp)
40 {
41     temp.ShowMem();
42 }
43
44 int main()
45 {
46     Base b(1,2);
47     b.ShowMem();
48     Derived d(3, 4, 5);
49     d.ShowMem();
50
51     test(b);
52     test(d);
53
54     system("PAUSE");
55     return 0;
56 }

输出:

加virtual

#include<iostream>
#include<stdlib.h>
using namespace std;

class Base {
private:
	int mA;
	int mB;
public:
	Base(int a, int b)
	{
		mA = a;
		mB = b;
	}
	virtual void ShowMem()
	{
		cout << mA << "  " << mB << endl;
	}
};

class Derived:public Base {
private:
	int mA;
	int mB;
	int mC;
public:
	Derived(int a, int b, int c):Base(a,b)
	{
		mA = a;
		mB = b;
		mC = c;
	}
	void ShowMem()
	{
		cout << mA << "  " << mB << "  " << mC << endl;
	}
};

void test(Base &temp)
{
	temp.ShowMem();
}

int main()
{
	Base b(1,2);
	b.ShowMem();
	Derived d(3, 4, 5);
	d.ShowMem();

	test(b);
	test(d);

	system("PAUSE");
	return 0;
}输出: 

使用方法:

virtual 返回类型 函数名(形参表)

  注意:只能出现在声明中

实现条件:
  • 类之间满足类的赋值兼容规则
  • 声明虚函数
  • 有成员函数来调用或者是通过指针,引用来访问同名函数
时间: 2024-10-15 22:33:33

多态——virtual的相关文章

【2017-04-14】命名空间、访问修饰符、封装、继承、多态

一.命名空间 namespace 命名空间名称 如果命名空间一致,才能在他下面访问那些不同的类,如果不一致是没有办法直接访问的. 不同命名空间下都是public访问修饰符,想要调用,得在using处引用命名空间 using .... 是引用的命名空间 二.访问修饰符(写在命名任何东西的最前面) public    公共的,访问权限最高 private    私有的,访问权限最低,只能在类的内部进行访问 protected   被保护的,当前类及他的派生类中进行访问 internal    默认的

初识继承和多态

集成的概念 在C#中,一个类可以继承另一个类,被继承的类通常称为父类或基类.继承其他类的类被称为子类或派生类.派生类的定义可以增加新的数据和功能,派生类的实例也直接可以使用父类的数据或功能,但父类的实例不可以直接使用子类定义的数据或功能 继承是面向对象编程中的一个重要特性.继承关系在类图中表示一个箭头,箭头指向父类如图所示: base关键字和protected修饰符 我们知道this关键字可以表示当前类的实例,通过它可以访问类本身的成员,在C#中还有一个base关键字表示父类,它可以用于访问父类

【2017-4-14】访问修饰符 封装 继承 多态

1.命名空间/程序集 2.访问修饰符public 公共的 - 访问权限是最高的private 私有的 - 只能在类的内部进行访问 internal 默认的 - 当前命名空间(程序集)下可以访问protected 被保护的 - 当前类及它的派生类中可以访问 3.封装private 数据类型 _名称; //成员变量,字段public 数据类型 名称 //属性{ get{ return _名称; } set{ _名称 = value; }} 还可以有方法 //成员方法 4.继承: 子类:父类一个子类只

面向对象 【封装】【继承】【多态】

创建一个新项目 using System;                                     --using System.Collections.Generic;        .using System.Linq;                                .          -- 引用的命名空间using System.Text;                             -- namespace ConsoleApplicatio

C++学习22 多态的概念及前提条件

在<C++基类和派生类的赋值>一节中讲到,基类的指针也可以指向派生类对象.请看下面的例子: #include <iostream> using namespace std; class People{ protected: char *name; public: People(char *name):name(name){} void display(){ cout<<"People: "<<name<<endl;} }; c

C++三大特性之多态

原文地址:https://qunxinghu.github.io/2016/09/08/C++%20%E4%B8%89%E5%A4%A7%E7%89%B9%E6%80%A7%E4%B9%8B%E5%A4%9A%E6%80%81/ 概念 多态(Polymorphisn) 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说:允许将子类类型的指针赋值给父类类型的指针(一个接口,多种方法).C++ 支持两种多态

C#面向对象编程 封装 继承 多态

  C#面向对象编程 什么是面向对象? 面向对象编程是上个实际六十年代继面向结构编程之后提出的一个新的编程思想 封装,继承,多态 封装,继承,多态是面向对象编程的核心: 封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类).被封装的对象通常被称为抽象数据类型 意义是:保护数据不被破坏(例如一台电视机我们能使用它但是不能随意改变内部的电路) 关键字:private,public,protected,internal Public string name;

C++ 多态机制浅析

编译时多态--函数重载 编译后生成的中间代码(如GCC生成的.o文件,此时还不是汇编语言)函数名字有变化,看下面两个例子. void cc_show(const char*str)     ->    _Z7cc_showPKc void cc_show(int x)            ->     _Z7cc_showi 大家可以看到,函数名其实不同,与返回值.函数名.参数有关.函数重载的规则就是参数的个数或种类必须不同,所以就不会有混乱了. 运行时多态--virtual动态绑定 编译器

面向对象:继承、多态

1.继承   子类名:父类名 子类可以继承父类所有的公共方法和属性 一个父类可以有无数个子类.后辈类 一个子类只能有一个亲爹 父类.基类子类.派生类.超类        --不同种说法 2.多态 virtual   虚方法 override  重写 overload 重载 用法: class grandfa { public string p() { return "奶奶"; } } -- class father:grandfa { public virtual string peo