虚函数

类的概念及品种(ing)

对着背影说爱祢 提交于 2020-01-31 17:38:28
虚函数: 在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。 纯虚函数: 在声明虚函数时被“初始化”为0的函数。 抽象类 :至少包含一个纯虚函数的类。 虚析构函数 :释放派生类的对象。 C++规定,当一个成员函数被声明为虚函数之后,其派生类中的同名函数都自动成为虚函数。记住 来源: CSDN 作者: 泰乐熊 链接: https://blog.csdn.net/xiong3110/article/details/87428461

C++虚函数 - 静态函数能否为虚函数

我的梦境 提交于 2020-01-29 05:27:56
1.virtual与静态函数 C++中,静态成员函数不能被声明为virtual函数。 例如,下面的程序会编译失败。 class Test { public: // 编译错误:static成员函数不能声明为virtual virtual static void fun() { } }; 同样地,静态成员函数也不能被声明为const和volatile. 下面的程序也会编译失败。 class Test { public: // 编译错误: static成员函数不能为const static void fun() const { } // 如果声明为下面这样,是可以的。 const static void fun() {} 或类似于 const static int fun() { return 0; } }; 2.为何static成员函数不能为virtual static成员不属于任何类对象或类实例,所以即使给此函数加上virutal也是没有任何意义的。 静态与非静态成员函数之间有一个主要的区别。那就是静态成员函数没有this指针。 虚函数依靠vptr和vtable来处理。vptr是一个指针,在类的构造函数中创建生成,并且只能用this指针来访问它,因为它是类的一个成员,并且vptr指向保存虚函数地址的vtable. 对于静态成员函数,它没有this指针,所以无法访问vptr.

c/c++常见面试题一

╄→гoц情女王★ 提交于 2020-01-29 04:04:13
找工作这么多天了,贴一下常见基础题吧,谁找工作了还可以复习下。答案有的是缺少很多,想看全百度之谷歌之... 1.进程与线程的区别:   很长重点写了:一个程序必须有一个进程,一个进程要有一个线程。   进程在运行时有独立的内存单元,而线程则是共享内存单元,所以一个线程死掉这个进程就会死掉,但是一个进程死掉程序无所谓。所以多进程程序比多线程要      稳定。   2.c++函数传递参数的方式:   1.直接传递、引用、指针。   他们的优缺点:   1.按值传递,在传递的时候实参被复制了一份,然后在函数体内使用。如果修改函数体内的拷贝,而实参是没有改变的。   2.引用是别名,所以效率别指针快,也比指针安全。(优先使用引用而不使用指针)   3.按值传递和引用传递在传参过程中,都执行强类型检查,而指针传递的类型比较弱,如果参数被声明为void*基本上没有类型检查,只要是指针编译器就认为是合法的,所以这会造成BUG。   4.指针可以干引用的活,而且还可以传递空指针,特别函数特别应用。但是指针用起来本身就很麻烦,如非需要还是不用。 *3.什么是深拷贝和浅拷贝    深拷贝:拷贝了对象的资源,在新对象中又建立了一个新的字段把资源放进去,如果修改其一,另一个不会改变。    浅拷贝:没有拷贝对象资源,它们共享资源,如果改变其一另一个也会随之改变。 4.面向对象的三个基本特征   1)封装

虚函数与运算符重载(Virtual Operator Overloading)

a 夏天 提交于 2020-01-28 21:03:52
虚函数与运算符重载(Virtual Operator Overloading) 一、相关日志 运算符重载 http://blog.163.com/zhoumhan_0351/blog/static/399542272010027113311390 多态性与虚函数 http://blog.163.com/zhoumhan_0351/blog/static/3995422720100290234430 补充运算符重载 http://blog.163.com/zhoumhan_0351/blog/static/3995422720103182106992 二、虚函数与运算符重载 1、矩阵相乘的一个例子 //: C15:OperatorPolymorphism.cpp // Polymorphism with overloaded operators #include <iostream> using namespace std; class Matrix; class Scalar; class Vector; class Math { public: virtual Math& operator*(Math& rv) = 0; virtual Math& multiply(Matrix*) = 0; virtual Math& multiply(Scalar*) = 0;

最全面的C/C++编码规范总结

牧云@^-^@ 提交于 2020-01-28 20:02:33
C语言是面向过程的,而C++是面向对象的 对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读性、可维护性。例如我们可以规定某个项目的C语言程序要遵循这样的规定:变量的命名,头文件的书写和#include 等等。 下面是一些广为采用的编码规范: GNU Coding Standards Guidelines for the Use of the C Language in Vehicle Based Software C++ Coding Guidelines SUN Code Conventions for Java 以下是一些介绍编码、编码规范的书籍: C++编码规范,陈世忠,人民邮电出版社,2002 高质量程序设计指南:C++/C语言,林锐等,电子工业出版社,2003 注:以下只是根据课题组已有的经验给出的总结,并非对所有场景均适用。 对于高质量的工程,一般会做到: 代码简洁精炼,美观,可读性好,高效率,高复用,可移植性好,高内聚,低耦合,没有冗余,不符合这些原则,必须特别说明。 规范性,代码有规可循。特殊排版、特殊语法、特殊指令,必须特别说明。 小编推荐一个学C语言/C++的学习裙【 二六三,六八八,二七六 】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具

C/C++ 面试知识点2

流过昼夜 提交于 2020-01-27 19:13:25
7.浅拷贝和深拷贝的原理 浅拷贝(位拷贝)就是两/多个对象共享一块内存,其缺点就是当析构一个对象的时候,另一个对象也不存在了,如果再使用它就会发生错误。 同一块资源释放多次,崩溃或者内存泄漏 深拷贝就是完完全全的复制出一个对象,两者在内存上无任何关系。 必须显式提供拷贝构造函数和赋值运算符 缺省拷贝构造函数 在拷贝过程中是按字节复制的,对于指针型成员变量只复制指针本身,而不复制指针所指向的目标--浅拷贝。 8.常见的不能声明为虚函数的有哪些? 普通函数(非成员函数) 静态成员函数 内联成员函数 构造函数 友元函数 9.C++的静态多态和动态多态 静态多态:运行前确定类型,采用的是函数重载和泛型 动态多态:运行后确定类型或者函数调用,采用虚函数实现 10.C++虚函数的原理 11.C++虚函数占用类的大小 因为只需要维护一个指向虚表的指针,所以大小为4或8个字节 静态成员和函数不计入sizeof中。 12.new与malloc的区别 new与malloc的10点区别 1. 申请的内存所在位置 : new操作符从 自由存储区(free store) 上为对象动态分配内存空间,而malloc函数从 堆 上动态分配内存。 自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区 自由存储区是否能够是堆(问题等价于new是否能在堆上动态分配内存

探秘C++机制的实现

好久不见. 提交于 2020-01-27 02:57:08
我曾经自学过C++,现在回想起来,当时是什么都不懂。说不上能使用C++,倒是被C++牵着鼻子走了。高中搞NOIP并不允许使用STL库,比赛中C++面向对象的机制基本没有什么用武之地,所以高中搞NOIP名为用C++,其实就是c加上了cout和cin。 前几天看韩老师的《老码识途》,里面记录了一些C++面向对象机制的探索,又勾起了我的兴趣。而这个学期自学了汇编,又给了我自己动手探索提供了能力基础,自己上手以后,从一个更加底层的视角看C++机制的实现,让我在黑暗中摸到了驯服C++的缰绳。 引用: 本质上是指针,这一点即使大家没有看反汇编应该也是猜到了。 对象在内存上的布局: 1: class Father 2: { 3: int iA_; 4: int iB_; 5: 6: void FuncA(); 7: void FuncB(); 8: }; 9: 10: class Child : Father 11: { 12: int iC_; 13: void FuncC(); 14: }; 一个Father对象里只包含 (低地址 –> 高地址) : iA_,iB_。也就是一个Father对象的大小是8个字节,函数并不会占用内存空间。 为什么不会? 其实类的成员函数可以看做本质上与普通函数相同。 编译器在编译的时候就知道函数的位置,所以调用普通函数的时候会直接 call 函数地址(偏移)

单继承,多继承,虚拟继承,sizeof大小

冷暖自知 提交于 2020-01-24 23:48:34
1. 题目 #include<iostream>using namespace std;class S {};class A:S { virtual void fun() { ; }};class B:A { virtual void fun() { ; }};class C:B { virtual void fun() { ; }};class M { virtual void fun() {}};class N { virtual void fun() {}};class P:M,N { virtual void fun() {}};//------------------------------class T_S {};class T_A:virtual T_S { virtual void fun() { ; }};class T_B:virtual T_A { virtual void fun() { ; }};class T_C:virtual T_B { virtual void fun() { ; }};class T_M { virtual void fun() {}};class T_N { virtual void fun() {}};class T_P:virtual T_M,T_N { virtual void fun() {}};int main() {

虚函数

删除回忆录丶 提交于 2020-01-23 23:02:05
/* 虚函数 */ /*********************************************************************** 虚函数建立在继承情况下的 虚函数 : 一个成员函数 ( 不包括构造函数和静态成员函数 ) 前面有 virtual 关键字 虚函数好处 : 可以用一致的 ( 相同的 ) 方法,在不同种情况,完成不一样的实现 用同样的接口,完成不同的实现 虚函数写法 : 1. 在基类和派生类中,有同名的函数,参数一样 , 返回值一样。那么在基类中 此函数前加上 virtual 关键字 , 派生类 (virtual) 可加可不加 2. 调用,必须使用基类的指针或则引用完成调用 如何判断函数去哪里 ? pb->Fun(); 基类的指针调用函数 FUN 1 如果 FUN 是非虚成员函数 , 那么执行 基类 ::FUN() 2 如果 FUN 是虚函数 a. 如果基类指针指向的是基类对象,执行基类 ::FUN() b. 如果基类指针指向的是派生类对象,执行派生类 ::FUN() ***********************************************************************/ #include "stdafx.h" #include <iostream.h> class A { public :