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 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容 ...
随机推荐
- 使用LNMP常见问题解答
使用LNMP常见问题解答 一.LNMP的安装过程详解,注:绿色文字为注释,实际使用过程中没有. ##先要下载,并根据不同系统进行安装: wget -c http://soft.vpser.net/ln ...
- Polar Code主要研究者的个人主页(持续更新中........)
Polar Code主要研究者的个人主页(持续更新中........) 1. Polar码的编译码.以及List译码算法,都少不了Ido Tal这位大牛. http://webee.technion. ...
- 切换样式.toggleClass()
切换样式.toggleClass() 在做某些效果的时候,可能会针对同一节点的某一个样式不断的切换,也就是addClass与removeClass的互斥切换,比如隔行换色效果 jQuery提供一个to ...
- java中,静态代码块static的简单简介
直接上代码,更直观,包括一些解释: /** * 类初始化时,首先加载静态代码块, * 注意:所有静态代码块都会在方法之前执行,不管放置的位置:但是静态代码块按照顺序执行 * 再次执行调用的方法 */ ...
- STL源码剖析(heap)
STL heap并不是容器,而是一系列的算法. 这些算法接受RandomAccessIterator[start, end),并将其表述成一棵完全二叉树. 关于heap算法可以参考之前算法导论的一篇博 ...
- centOS7 安装redis-3.2.6
0.下载tar.gz包并解压到某个位置,然后cd进入解压后的目录(redis-3.2.6)下 1.安装 make MALLOC=libc 关于为什么这样做,参考redis-3.2.6目录下的READM ...
- jmeter-BeanShell Sampler
https://www.cnblogs.com/ShadowXie/p/6025941.html
- java读取本地txt文件并插入数据库
package com.cniia.ny.web.control.configManage; import java.io.BufferedReader; import java.io.File; i ...
- SQL 2005示例库(转载)
sql2005数据库实例 从网上找还得麻烦,转了过来,点击就可以下载! 在学习SQL2005中离开不了SQL2005示例数据库,AdventureWorks数据库下载安装,,northwind数据库下 ...
- MSBuild入门(续)
MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充.主要有一下几方面 ...