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(){
        cout<<"Function f() in Class1"<<endl;
    }
    void g(){
        cout<<"Function g() in Calss1"<<endl;
    }
private:
    int a;
};

//写个类模版
template <class genType>
class genClass {
public:
    genClass(){}
    ~genClass(){}
    virtual void f(){
        cout<<"Function f() in Class2"<<endl;
    }
    void g(){
        cout<<"Function g() in Class2"<<endl;
    }
private:
    genType a;
};

class Class3{
public:
    Class3(){}
    ~Class3(){}
    //写个函数模版
    template <class genType>
    void h(genType a) {
        cout<<"Function h() in Class3"<<endl;
    }
private:

};

int main(int argc, const char * argv[]) {
    Class1 object1,*p;
    genClass<int> object2;
    Class3 object3,*q=&object3;
    p=&object1; //P指向object1
    p->f();
    p->g();

    p=(Class1 *)&object2;// p指向object2 并且对类指针进行强制类型转换
    p->f();
    p->g();

    p=(Class1*)&object3; //p指向object3 并且对类指针进行强制类型转换

    //p->f();//编译成功,运行出错。
    p->g(); // 输出: Function g() in Calss1
   // p->h(); //编译出错,在Class1 中找不到h

    //测试一下类Class3中的函数模版怎么用
    q->h(3);  // 输出: Function h() in Class3
    q->h("jjjdscdjd"); // 输出: Function h() in Class3
    return 0;
}

运行结果

Function f() in Class1
Function g() in Calss1
Function f() in Class2
Function g() in Calss1
Function g() in Calss1
Function h() in Class3
Function h() in Class3
Program ended with exit code: 0

Tips

  • 对于编译器来说,是否在Class3中定义了h()并不重要(不管是否为虚函数)。
  • 在C++中,动态绑定是通过将成员函数声明为virtual来实现的。
  • 友元是一个不属于类成员的函数,但是他有权访问该类的私有成员,使用友元函数(friend)违背信息隐藏的原则。

原文地址:https://www.cnblogs.com/overlows/p/10670405.html

时间: 2024-10-05 05:04:56

OOP 多态/虚函数的相关文章

多态&amp;虚函数

(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

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"

彻底搞懂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关键字只用在类定义里的函数声明,写函数体时不用 构造函数和静态成员函数不能是虚函数 虚函数可以参与多态,普通函数不能 - 多态的表现形式一 派生类的指针可以赋给基类指针 通过基类指针指向一个基类和派生类中的同名虚函数时 若该指针指向一个基类对象,那么被调用的是基类的虚函数 若该指针指向一个派

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

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

C++中的虚函数、重写与多态

在C++中顺利使用虚函数需掌握的技术细节 如函数在派生类中的定义有别于基类中的定义,而且你希望它成为虚函数,就要为基类的函数声明添加保留字virtual.在派生类的函数声明中,则可以不添加virtual.函数在基类中virtual,在派生类中自动virtual(但为了澄清,最好派生类中也将函数声明标记为virtual,尽管这并非必须). 保留字virtual在函数声明中添加,不要再函数定义中添加. 除非使用保留字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_