一.构造函数为什么不能为虚函数 1. 从存储空间角度,虚函数相应一个指向vtable虚函数表的指针,这大家都知道,但是这个指向vtable的指针事实上是存储在对象的内存空间的.问题出来了,假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数. 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到相应的调用.构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀.所以构造函数没有必要是虚…
1 昨日回顾 2 多态的原理 1 要有继承 2 要有子类重写父类的虚函数 3 父类指针(或者引用)指向子类对象 (动态联编 虚函数表 3 证明vptr指针的存在 4 vptr指针在构造父类的时候是分步初始化的 Child c; 1. 先调用Parent的构造函数 2. 调用的时候vptr指针会先指向父类的虚函数表 5 vptr指针分步的安全性 根据上一节课所讲内容 应该可以得出结论: 6 父类指针和子类指针的步长 这样虽然能运行,但是要注意,如果子类的private中多了一个int b 那么子类…
1.多态的作用 在面向对象程序设计中,使用多态能够增强代码的可扩充性,,即程序需要增加或修改部分功能时,只需修改少量代码就能够达到目的,此外多态也能起到精简代码的作用. 而实现多态的关键点,就是虚函数如何使用. 虚函数 1.虚函数的使用方法 .基同类与派生类同时拥有的同名同参数表的函数,在设计时,最好将其声明为虚函数,只需在函数前面加上关键字virtual即可 下面通过一个具体的例子来说明 #include<iostream> using namespace std; class Shape{…
构造函数不能是虚函数.但有时候确实需要能传递一个指向基类对象的指针,并且有已创建的派生类对象的拷贝.通常在类内部创建一个Clone()方法,并设置为虚函数. //Listing 12.11 Virtual copy constructor #include <iostream> using namespace std; class Mammal { public: Mammal():itsAge() { cout << "Mammal constructor...\n&q…
今天面试,忽然被问到这个题目,查了一下果然有欸. #include <iostream> using namespace std; class A { }; class B { public: B() {} ~B() {} }; class C { public: C() {} virtual ~C() {} }; int main(int argc, _TCHAR* argv[]) { cout<<sizeof(A)<<"\t"<<si…
继承 含义:在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类 优点:1)代码的重用性:2)子类扩展父类的属性和方法:3)父类的属性和方法可用于子类:4)设计应用程序变得更加简单 继承的实现: 关键字extends:继承其他类,可以继承public,protected 子类继承父类,父类派生子类 下面是用于声明Salary类是Employee类的子类: public class Salary extends Employee Object类(基类/超类)是所有类…
1)定义Student类,用string型变量name存储学生姓名,用int型变量age存储学生年龄.Student类实现IComparable接口.要求从键盘输入学生的姓名和年龄,并注意可能出现的异常及其处理.IComparable接口定义如下(系统已定义,可直接使用) interface IComparable { int CompareTo(object obj); //如果自身与obj相等返回0,<obj返回-1,>obj返回1 ,注意可能出现的异常 } (2)定义Student类的派…
最近在看cocos2d-x的源码,非常感激cocos2d作者的开源精神.在看代码的过程中感觉两个方向让我受益,1.把之前从书中看到的c++知识,明白了怎么运用.2.学习作者驾驭代码的巧妙方法. 看coco2d-x的时候我发现了自己对多态之前不了解的知识,废话少说上代码: #include <iostream> #include <string> using namespace std; class parent { public: virtual void printMsg();…
一:纯虚函数和抽象类 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本 纯虚函数为各个派生类提供一个公共接口 纯虚函数的形式: virtual 类型 函数名(参数列表)=0: 一个具有纯虚函数的基类称为抽象类 注意:抽象类不能实例化对象 一个派生类继承抽象类但是未实现纯虚函数,则也变为抽象类,可以继续被继承实现 class Parent //抽象类 { public: Parent() { cout << "Parent construct&quo…
转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义: 称带有纯虚函数的类为抽象类. ⑵抽象类的作用: 抽象类的主要作用是将有关的操作作为结果接口组织在一个继承层次结构中,由它来为派生类提供一个公共的根,派生类将具体实现在其基类中作为接口的操作.所以派生类实际上刻画了一组子类的操作接口的通用语义,这些语义也传给子类,子类可以具体实现这些…