博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类相关总结-1
阅读量:5876 次
发布时间:2019-06-19

本文共 921 字,大约阅读时间需要 3 分钟。

hot3.png

1. 虚函数的实现原理

    在C++的类内会维护一个虚表,同时还有一个虚指针。可以通过VC 6.0来观看类的虚函数表。

#include 
#include
class A{public : virtual void f(){ std::cout<<"This is A's f"<

    

    C++的类中第一个变量就是虚指针。其中a类的地址是0x0012ff44,紧接着就是虚指针。而b类的地址为0x0012ff40,由此可见a类内只有虚指针这一个变量。

    

    解决了虚指针的问题,现在正式进入虚函数表。从代码可以看到,A类内定义了两个虚函数 f() 和 g() ,B类继承A类,实现了虚函数 f() ,并没有实现 g() , C类正好相反。D类暂时不讨论,她负责解释多重继承产生二义性的问题。

    通过VC 6.0的调试可以看到各个虚函数的地址,如图。

    

    可以看到,a类的虚指针里有两个虚函数地址分别为0x004012cd(A::f(void))和0x004011b8(A::g(void))。而b类继承a类,由于b类只实现了虚函数f(),所以b类的虚指针内的B::f(void)是指向b类内实现的虚函数,而g()函数还是指向A类的A::g(void)函数。C类则与B类类似。

    总结下,C++的类是通过一个虚指针(__vfptr)指向一个虚函数表来实现虚函数的功能,从而实现动态的多态。

2. 通过子类调用父类”们“方法

    依然是刚才那段代码,我在B、C、D类内分别写了test(),来调用父类”们“的方法。

#include 
#include
class A{public : virtual void f(){ std::cout<<"This is A's f"<

    

    在运行时对继承方式做了修改,通过网络图和结果显示。具体请看下图。

            

            

            

    总结下,不管怎么继承子类都可以调用父类的方法,但是当子类B、C私有继承类A时,类B、C的子类D则不能调用类A的方法。

转载于:https://my.oschina.net/u/1171424/blog/212968

你可能感兴趣的文章
项目开发总结
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
查看>>
Ubuntu ctrl+alt会导致窗口还原的问题
查看>>
第四十期百度技术沙龙笔记整理
查看>>
推荐系统那点事 —— 基于Spark MLlib的特征选择
查看>>
linux 下RTL8723/RTL8188调试记录(命令行)【转】
查看>>
開始新的征程
查看>>
SpringMVC案例1——对User表进行CRUD操作
查看>>
看雪CTF第十四题
查看>>
模拟生命_吸烟致癌?
查看>>
[Contiki系列论文之1]Contiki——为微传感器网络而生的轻量级的、灵活的操作系统...
查看>>
Android 网络编程 记录
查看>>
微软同步发行Windows 10和Windows 10 Mobile系统更新
查看>>
Maven 传递依赖冲突解决(了解)
查看>>
Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)
查看>>
[Spark][Python]Spark Join 小例子
查看>>
form表单下的button按钮会自动提交表单的问题
查看>>
大战设计模式【11】—— 模板方法模式
查看>>