OOP 多态虚函数

mac2022-06-30  24

// 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 Class1Function g() in Calss1Function f() in Class2Function g() in Calss1Function g() in Calss1Function h() in Class3Function h() in Class3Program ended with exit code: 0

Tips

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

转载于:https://www.cnblogs.com/overlows/p/10670405.html

最新回复(0)