C++ 类的多态一(virtual关键字--构造函数深刻理解)
//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 = , int b = ){
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");
}

C++ 类的多态一(virtual关键字--构造函数深刻理解)的更多相关文章
- Abstract和Virtual和interface , 派生类中重写 override / new关键字
http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html C#中Abstract和Virtual 在C#的学习中,容易混淆virtua ...
- C++ 学习笔记 (七)继承与多态 virtual关键字的使用场景
在上一篇 C++ 学习笔记 (六) 继承- 子类与父类有同名函数,变量 中说了当父类子类有同名函数时在外部调用时如果不加父类名则会默认调用子类的函数.C++有函数重写的功能需要添加virtual关键字 ...
- C++ 多态、虚函数(virtual 关键字)、静态联编、动态联编
函数重写:(在子类中重写父类中的函数) 父类中被重写的函数 依然会继承 给子类. 子类中重写的函数将覆盖父类中的函数. 通过作用域分辨符 :: 可以访问到父类中的函数. 例如: #includ ...
- 条款7:为多态基类析构函数声明为virtual
基类指针指向子类对象. 子类对象必须位于堆.因此为了避免泄漏内存资源,当指针不使用时,delete掉每一个对象非常重要.但是如果基类的析构函数不声明为virtual.那么指向子类对象的指针delete ...
- C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)
//多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...
- 浅析C#中new、override、virtual关键字的区别
Virtual : virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写. 默认情况下,方法是非虚拟的.不能重写非虚方法. virtual 修饰符不能与 stati ...
- 浅析c++中virtual关键字
http://blog.csdn.net/djh512/article/details/8973606 1.virtual关键字主要是什么作用? c++中的函数调用默认不适用动态绑定.要触发动态绑定, ...
- C++ 类的多态二(函数重载--函数重写--函数重定义)
//函数重载--函数重写--函数重定义 #include<iostream> using namespace std; /* 函数重载: 必须在一个类中进行(子类无法重载父类中的函数) 子 ...
- .NET Core CSharp初级篇 1-6 类的多态与继承
.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
随机推荐
- Android adb shell学习心得(四)
1.awk中的sub sub为替换函数.形式如 sub(/1/,"",$2) 将第二个变量的第一个1替换为空,若将sub替换为gsub.则替换全部的1. 2.awk中的-F 分隔符 ...
- http_load压力测试使用
介绍:http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会把客户机搞死.还可以测试HTTPS类的网站请求. ...
- 深入理解C#中的泛型(一)
为什么要有泛型? 请大家思考一个问题:由你来实现一个最简单的冒泡排序算法.假设没有使用泛型的经验.可能会毫不犹豫的写出下面代码: public class SortHelper { //參数为int数 ...
- Rails 枚举
Rails Model中使用枚举有两种方案,一种是rails内置的enum,一种使用enumerize这个gem,不管哪种都能达到相同的目的. 首先介绍第一种: 一. enum 基本使用方法,以一个案 ...
- javascript脚本中使用json2.js解析json
官方地址:https://github.com/douglascrockford/JSON-js 点击页面右下角“Download ZIP”下载 网页中引用json2.js,下面是一个简单的例 ...
- Jquery滑动门实现
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 算法笔记_082:蓝桥杯练习 12-1三角形(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 为二维空间中的点设计一个结构体,在此基础上为三角形设计一个结构体.分别设计独立的函数计算三角形的周长.面积.中心和重心.输入三个点,输出这 ...
- ZK框架笔记4、通用组件、页面、桌面
组件(component)是一种用户接口(UI)对象,如一个标签.按钮.树. 页面(page)是一个组件的集合. 桌面(desktop)是一个包含相同URL请求的页面. ...
- RandomForest&ROC
# -*- coding: utf-8 -*- # __author__ = 'JieYao' from biocluster.agent import Agent from biocluster.t ...
- win7保护眼睛的颜色设置方法(85,125,205)
win7保护眼睛的颜色设置方法(85,125,205) 在电脑桌面空白处点击右键“个性化”按钮. 在弹出的对话框单击“窗口颜色”. 在弹出的新的对话框中单击“高级外观设置”. 在弹出的窗口颜色和外观中 ...