C++ 虚函数 虚继承
来源:互联网 发布:如何申请顶级域名 编辑:程序博客网 时间:2024/05/19 12:15
C++ 的虚函数主要就是 实现多态机制,主要是通过一个虚函数表,知道具体的子类函数还是父类函数的地址,在执行。
先来看一个父类:
父类的虚函数表:
表中的最后一段区域 . 表示虚函数表的结束标志,若此处为1 还有下一个虚表 为0 虚表结束。
一般继承(没有覆盖的情况)
没有覆盖的情况下继承,子类的虚函数地址 存放在父类的后面:
继承(存在覆盖):多态
此时的虚函数表:
可以看到子类覆盖父类的函数f();
所以当 Base * p = new Derived;
p->f();
在此虚函数表中,调用的就是子类的f()函数;
但当使用p->g1()的时候 出现编译错误,父类指针不能指向子类的其他非覆盖的成员函数。
虚继承:
主要就是为了解决多继承的问题;
简述代码:
#include <iostream>using namespace std;class Base{ public: virtual void f() { cout << "f() == " <<endl; } virtual void g() { cout << "g() == " <<endl; } virtual void h() { cout << "h() == " <<endl; }};class Derived:public Base{ public: void f0() { cout << "Derived() - f() == " << endl; } void g0() { cout << "Derived() - g() == " << endl; }};class Derived1:public Base{ public: void f1() { cout << "Derived() - f() == " << endl; } void g1() { cout << "Derived() - g() == " << endl; }};class Derived2:public Derived,public Derived1{ public: void P() { cout << "Derived2 - P() == " << endl; }};int main(){ //Base *b = new Derived; //b->f(); //子类 调用自己的成员函数 不能使用-> //b->g1(); 编译错误 使用父类指针不能指向子类的成员函数 Derived2 ddd; ddd.f(); return 0;}不是虚继承,会出现错误:
原因:不清楚f()到底所属谁;
应加上虚继承:
#include <iostream>using namespace std;class Base{ public: virtual void f() { cout << "f() == " <<endl; } virtual void g() { cout << "g() == " <<endl; } virtual void h() { cout << "h() == " <<endl; }};class Derived:virtual public Base{ public: void f0() { cout << "Derived() - f() == " << endl; } void g0() { cout << "Derived() - g() == " << endl; }};class Derived1:virtual public Base{ public: void f1() { cout << "Derived() - f() == " << endl; } void g1() { cout << "Derived() - g() == " << endl; }};class Derived2:public Derived,public Derived1{ public: void P() { cout << "Derived2 - P() == " << endl; }};int main(){ //Base *b = new Derived; //b->f(); //子类 调用自己的成员函数 不能使用-> //b->g1(); 编译错误 使用父类指针不能指向子类的成员函数 Derived2 ddd; ddd.f(); return 0;}运行正确;
0 0
- C++,继承、虚函数解惑!
- C++,继承、虚函数解惑!
- c/c++----------虚函数、虚继承、纯虚函数
- [C++]虚函数的虚继承
- C/C++虚函数与虚继承
- [C/C++]继承、多态和虚函数整理
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- 【C++】c++单继承、多继承、菱形继承内存布局(虚函数表结构)
- [C++]virtual关键字:虚函数,虚继承和虚基类
- 【C++】虚函数和虚继承的内存分布情况
- 类的继承、抽象类、虚函数[C++]
- 【足迹C++primer】52、转换和继承,虚函数
- 【C++】内联inline、继承、重载与虚函数的解释
- 【C++】虚函数在不同继承方式中的对象模型
- 虚函数 虚继承
- 虚函数、虚继承
- 虚函数,虚继承
- 继承与虚函数
- 欢迎进入Android多进程时代
- 模拟退火算法TSP
- spring源码编译和导入eclipse
- dynamic_cast的用法
- ajax用post提交中文乱码问题(待补充)
- C++ 虚函数 虚继承
- python实现清华大学联网助手(三)——linux下带参数的自定义命令/import机制
- 《数据结构编程实验》 4.1.1Calendar
- 尊敬的用户:您访问的域名有误或网页不存在,您可以使用我们提供的以下服务
- 问题解决:java.sql.SQLException:Value '0000-00-00' can not be represented as java.sql.Date
- [算法第一轮复习] 并查集 + 路径压缩
- Quartz 2D绘图基本用法
- 什么是线程安全和线程不安全
- 算法导论读书笔记之btree