OOP 多态/虚函数

Posted overlows

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)违背信息隐藏的原则。

以上是关于OOP 多态/虚函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 多态相关

利用虚函数实现多态的方式:动态绑定

C#多态性学习,虚方法抽象方法接口等用法举例

多态实现--虚函数与纯虚函数

OOP2(虚函数/抽象基类/访问控制与继承)

[ C++ ] 多态原理 多态