VS之多态虚函数的实现

本文简单地介绍下如何使用多态和虚函数实现程序的调用。

使用工具:VS2008

使用语言:C++

开发步骤:

1.新建对话框程序

2.添加基类,写一个虚函数

Person.h

#pragma once

class CPerson
{
public:
	CPerson(void);
	~CPerson(void);
public:
	virtual void Eat();
};

Person.cpp

#include "StdAfx.h"
#include "Person.h"

CPerson::CPerson(void)
{
}

CPerson::~CPerson(void)
{
}

void CPerson::Eat()
{
	AfxMessageBox(_T("有个人吃了些水果..."));
}

3.添加派生类,重写虚函数

Old.h

#pragma once
#include "person.h"

class COld : public CPerson
{
public:
	COld(void);
	~COld(void);
public:
	void Eat();
};

Old.cpp

#include "StdAfx.h"
#include "Old.h"

COld::COld(void)
{
}

COld::~COld(void)
{
}

void COld::Eat()
{
	AfxMessageBox(_T("年长者吃了些香蕉..."));
}

Youth.h

#pragma once
#include "person.h"

class CYouth : public CPerson
{
public:
	CYouth(void);
	~CYouth(void);
public:
	void Eat();
};

Youth.cpp

#include "StdAfx.h"
#include "Youth.h"

CYouth::CYouth(void)
{
}

CYouth::~CYouth(void)
{
}

void CYouth::Eat()
{
	AfxMessageBox(_T("年青人吃了些苹果..."));
}

Child.h

#pragma once
#include "person.h"

class CChild : public CPerson
{
public:
	CChild(void);
	~CChild(void);
public:
	void Eat();
};

Child.cpp

#include "StdAfx.h"
#include "Child.h"

CChild::CChild(void)
{
}

CChild::~CChild(void)
{
}

void CChild::Eat()
{
	AfxMessageBox(_T("小家伙吃了些葡萄..."));
}

4.添加消息响应事件

VirtualFunctionDemoDlg.h

public:
	afx_msg void OnBnClickedBtnPerson();
	afx_msg void OnBnClickedBtnOld();
	afx_msg void OnBnClickedBtnYouth();
	afx_msg void OnBnClickedBtnChild();

VirtualFunctionDemoDlg.cpp

void CVirtualFunctionDemoDlg::OnBnClickedBtnPerson()
{
	//Person COld CYouth CChild
	CPerson* pPerson = NULL;
	pPerson  = new CPerson;
	pPerson->Eat();
}

void CVirtualFunctionDemoDlg::OnBnClickedBtnOld()
{
	CPerson* pPerson = NULL;
	pPerson  = new COld;
	pPerson->Eat();
}

void CVirtualFunctionDemoDlg::OnBnClickedBtnYouth()
{
	CPerson* pPerson = NULL;
	pPerson  = new CYouth;
	pPerson->Eat();
}

void CVirtualFunctionDemoDlg::OnBnClickedBtnChild()
{
	CPerson* pPerson = NULL;
	pPerson  = new CChild;
	pPerson->Eat();
}

5.实现效果

对话框界面

点击基类指针按钮效果:person

 

点击派生类指针按钮效果:old

 

点击派生类指针按钮效果:youth

 

点击派生类指针按钮效果:child

 

好了,效果就演示到这儿了。

源码下载

时间: 2024-10-04 23:37:05

VS之多态虚函数的实现的相关文章

多态&虚函数

(1).对象类型: a.静态类型:对象声明时的类型,编译的时候确定 b.动态类型:对象的类型是运行时才能确定的 class A {}; class B:public A {}; int main() { B* b; A* a=b;//a的静态类型是A*,动态类型(运行时)类型是B* return 0; } (2).多态 a.静态多态:函数重载.泛性编程 int Add(int a,int b) { return a+b; } float Add(float a,float b) { return

OOP 多态/虚函数

// main.cpp // OOP // 虚函数允许继承层次结构中绝大多数特定版本的成员函数被选择执行,虚函数使多态成为可能. // Created by mac on 2019/4/8. // Copyright ? 2019年 mac. All rights reserved. #include <iostream> using namespace std; class Class1{ public: Class1(){} ~Class1(){} virtual void f(){ co

彻底搞懂C++多态虚函数等问题

1.继承和覆写 子类继承父类,子类可以覆写基类的函数.当然,直接生成一个子类的对象,用子类的指针操作是没有问题的.调用的函数是子类的函数,即覆写后的. // ConsoleApplication3.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using namespace std; class Base { public: Base(void) { cout<<"Bas

【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态

实现基类(父类)以及派生类(子类),验证继承与转换--赋值兼容规则: 子类对象可以赋值给父类对象(切割/切片) 父类对象不能赋值给子类对象 父类的指针/引用可以指向子类对象 子类的指针/引用不能指向父类对象(可以通过强制类型转换完成) #include<iostream> using namespace std; class People    //父类或者基类 { public:     void Display()     {         cout << "_na

虚函数和多态

虚函数和多态 - 虚函数 在类的定义中,前面有virtual类关键字的成员函数就是虚函数 class base{ virtual int get(); }; int base::get(){} virtual关键字只用在类定义里的函数声明,写函数体时不用 构造函数和静态成员函数不能是虚函数 虚函数可以参与多态,普通函数不能 - 多态的表现形式一 派生类的指针可以赋给基类指针 通过基类指针指向一个基类和派生类中的同名虚函数时 若该指针指向一个基类对象,那么被调用的是基类的虚函数 若该指针指向一个派

c++虚函数与多态实例分析

1 #include <iostream> 2 #include <complex> 3 using namespace std; 4 5 class Base 6 { 7 public: 8 Base() {cout<<"Base-ctor"<<endl;} 9 ~Base() {cout<<"Base-dtor"<<endl;} 10 virtual void f(int){cout<

虚函数与多态

如果我们有三个类Person.Teacher.Student它们之间的关系例如以下: 类的关系图 普通成员函数 [Demo1] 依据这个类图,我们有以下的代码实现 #ifndef __OBJEDT_H__ #define __OBJEDT_H__ #include <string> #include <iostream> class Person { public: Person(const string& name, int age) : m_name(name), m_

(C++)浅谈多态基类析构函数声明为虚函数

主要内容: 1.C++类继承中的构造函数和析构函数 2.C++多态性中的静态绑定和动态绑定 3.C++多态性中析构函数声明为虚函数 1.C++类继承中的构造函数和析构函数 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 具体参考文章:http://www.cnblogs.com/AndyJee/p/4575385.html 2.C++多态性中的静态绑定和动态绑定 对象的静态类型:对象在声明是采用的类型,在

GeekBand-secondweek-c++的多态和虚函数

多态与虚函数 13章的简单继承只是实现了对已有对象的实现的重定义和直接调用,但是向上映射导致的对象切割仍然是个缺陷: 1.延续13章的向上映射 简单继承中,派生类重定义了基类的成员函数,此时,向上映射的结果是很明显的,它使用了基类实现的函数版本,这显然并不是我们想要的效果:为什么会有这样的结果发生,我们先探讨几个问题: 函数调用绑定:函数调用确定目标函数体称为捆绑,编译期绑定称为早绑定,上面的问题就是早绑定引起的,因为编译器只知道基类对象的类型,调用函数也会绑定基类实现的函数版本,要解决这一问题