C++ 类的多态一(virtual关键字--构造函数深刻理解)
2016-07-01 09:59
375 查看
//virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代码的编译,不会考虑上下文 例如编译到void ProtectA(Point pin) 编译器就会认为pin就是Point类型, 而不会去联系上下文,去分析pin有没有可能是子类对象 virtual关键字会自动检测这个父类对象有没有是子类对象 */ /* virtual关键字的作用 假设父类中存在用virtual关键字修饰的函数A,在子类中重写了该函数 当变量是父类时,c++编译器会检测传递过来的变量是不是子类对象, 如果传过来的是子类对象,那么c++编译器会自动调用子类的同名函数A, 如果传过来的是父类对象,那么c++编译就无法访问子类的同名函数A,只能调用父类的函数A */ class Point{ public: Point(Point &p){ cout << "我是父类,拷贝构造函数被执行了1" << endl; this->x = p.x; this->y = p.y; } Point(int a = 1, int b = 1){ this->x = a; this->y = b; } virtual void Print(){ cout << "x=" << x << endl; } private: int x; int y; }; class PointA :public Point{ public: void Print(){ cout << "我是子类,我重写的父类的成员函数" << endl; } }; //赋值兼容原则 void ProtectA(Point pin){ pin.Print(); } void ProtectC(Point &pin){ //引用是指针 pin.Print(); } void ProtectD(Point *pin){ pin->Print(); } void ProtectB(){ PointA pa; /* PointA pa;详解: 这句话执行了Point类的Point(int a = 1, int b = 1)构造函数, 此时子类对象pa中的父类成员x=1,y=1,虽然x,y无法在子类pa中访问 */ ProtectA(pa); //调用void ProtectA(Point pin)函数, //①执行父类拷贝构造函数 注意此时pa中的父类成员x,y都是有值的,也因此x=1,而不是乱码 //②产生新的父类临时对象pin(此时pin已经是父类对象,他执行的是拷贝构造函数) //③父类对象调用virtual关键字修饰的函数, //c++编译会在父类内存区域向后搜索子类属性,发现没有子类属性 //c++编译器判断这个对象时父类对象,直接调用父类的Print() ProtectC(pa); ProtectD(&pa); } void main(){ ProtectB(); system("pause"); }
相关文章推荐
- Qt/C++ 添加pri文件
- 23种设计模式全解析
- c语言指针的初始化和赋值
- c++中resize这个函数怎么用
- c++如何自定义ostream对象,使其实现cout的功能
- c++如何自定义ostream对象,使其实现cout的功能
- C++ 类型转换运算符
- NetRouter开发板 之使用c++调用系统命令pop使用
- HDU2024 C语言合法标识符【入门】
- C++书籍推荐
- FastRPC 3.2 发布,高性能 C++ 协程 RPC 框架
- 学生管理系统
- c++抽象类
- 漫谈C++:良好的编程习惯与编程要点【2】
- 漫谈C++:良好的编程习惯与编程要点【1】
- C语言实现学生信息管理系统(单链表)
- const在c与c++中的不同地位
- 漫谈C++:良好的编程习惯与编程要点【0】
- C 语言创建和使用 DLL
- 【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化