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 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
随机推荐
- linux 遇见错误Could not get lock /var/lib/dpkg/lock
通过终端安装程序sudo apt-get install xxx时出错:E: Could not get lock /var/lib/dpkg/lock - open (11: Resource te ...
- onmouseout,mouseover经过子元素也触发的问题解决方案
在mouseout与mouseover的冒泡问题上,相信有很多朋友都遇到过.今天这里就总结一下 关于mouseover和mouseout冒泡问题的解决方案: 首先,看下event.relatedTar ...
- 绘制函数y=(x^2-2x+1)/(x^2+x+2)的曲线
代码: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Type ...
- Android传感器的介绍
在Android2.3 gingerbread系统中,google提供了11种传感器供应用层使用. #define SENSOR_TYPE_ACCELEROMETER 1 //加速度#de ...
- Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误
Android Studio 项目中集成百度地图SDK报以下错误: java.lang.UnsatisfiedLinkError: Native method not found: com.baidu ...
- JedisCluster操作redis集群demo
package com.chenk; import java.util.HashMap; import java.util.HashSet; import java.util.List; import ...
- php抽象与接口的区别[转载]
来自:http://www.cnblogs.com/k5054/archive/2012/12/26/2834205.html 对于面向对象开发,抽象类与接口这两个东西是比较难理解的! 今天看了一整天 ...
- RxJava异步请求加载状态控制
在我看来,RxJava最大的特点就是异步,无论你是解析复杂的数据或是IO操作,我们都可以利用它内置的线程池进行线程间的调度,简单的使用 subscribeOn(Schedulers.io()).doO ...
- 经常使用的 WEB server
对于刚開始学习的人来说,或许自己能够写出一些简单的演示样例DEMO,但却纠结于不知道应该怎样才干訪问自己的页面,这里进行了一些简单的WEBserver总结.便于新朋友配置使用 静态HTML页面 对于静 ...
- 【VBA编程】04.使用自定义数据类型
使用自定义数据类型存储输入数据,并通过弹出窗口展示 [代码区域] Type lianxiren ' name As String Sex As String End Type Sub aa() Dim ...