一.虚继承 1.在多继承中,对于多个父类的数据及函数成员,虽然有时候把他们全部继承下来是有必要的,比如当这些成员都不同的时候。但在大多数的情况下,比如当多个父类之中的成员有重叠的地方时,因为保留多份数据成员的拷贝,不仅占有了较多的存储空间,还增加了访问的难度(由于继承了来自多个父类的同名数据成员,访问...
虚函数可以是内联函数,内联是可以修饰虚函数的,但是当虚函数表现多态性的时候不能内联。 内联是在编译器建议编译器内联,而虚函数的多态性在运行期,编译器无法知道运行期调用哪个代码,因此虚函数表现为多态性时(运行期)不可以内联。 inline virtual 唯一可以内联的时候是:编译器知道所调用的对象是哪个类(如 Base::...
由于是虚拟继承,又有自己的虚函数,所以先拥有一个自己的虚函数指针vpt_sonClass1,大小为4,指向自己的虚表;还要有一个char[3],大小为4;为了实现虚拟继承,首先sonClass1加入了一个指向其父类的虚类指针,记作vtp_sonClass1_VirtualInheritanc,大小为4;然后在加上父类的所有大小8,所以总共是20字节。 在gcc编译器...
classC:virtualpublicA//虚拟继承的时候编译器会安插一个指向父类的指针,大小为4 { }; classD//大小为4 { public: inta; staticintb;//静态变量被放在静态存储区 }; classE//print函数不占内存空间,大小为4 { public: voidprint(){cout<<"E"<<endl;} private: inta; }; classF//虚函数会占用一个...
3. 虚函数和纯虚函数的主要区别是什么? 答案: 1. 多态如何与继承关系工作? 答案: 2. 覆盖(override)和隐藏(hide)有什么区别? 答案: 3. 什么是对象切片(Object Slicing)?如何避免? 答案: 避免对象切片: 第四轮:虚析构函数和运算符重载 1. 什么是虚析构函数?为什么需要虚析构函数? 答案: 2. 如何在C++...
相当于把内联函数里面的内容写在调用内联函数处; 相当于不用执行进入函数的步骤,直接执行函数体; 相当于宏,却比宏多了类型检查,真正具有函数特性; 不能包含循环、递归、switch 等复杂操作; 在类声明中定义的函数,除了虚函数的其他函数都会自动隐式地当成内联函数。
2.派生类所有重写虚基类虚函数,且没有新定义虚函数,这时候,派生类中含有两个虚表指针。另一个基类自己虚表指针,个指向虚基类的虚函数指针。 2.基类不带虚函数的虚继承中,分两种情况,1.基类和派生类中都没有虚函数。这个时候,派生类仅仅会多加入一个虚表指针,指向虚基类的虚函数(尽管虚基类中没有虚函数)。2...
单继承下的虚函数表 派生类未覆盖基类虚函数 下面我们来看下派生类没有覆盖基类虚函数的情况,其中Base类延用上一节的定义。从图中可看出虚函数表中依照声明顺序先放基类的虚函数地址,再放派生类的虚函数地址。 可以看到下面几点: 1)虚函数按照其声明顺序放于表中。
虚函数实现机制 虚函数表 访问限定符 public、private、protected 继承原理、虚继承、菱形继承 静态绑定和...