C++继承(2)

原创 2012年03月22日 21:23:48

小时候梦想改变世界

在我们只需要改变自己


C++继承机制中最耀眼的应用莫过于基于虚函数的多态。在java中所有成员函数默认都是虚函数,C++中考虑到效率的问题,需要用关键字virtual显式声明。

(1)简单多态

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;

class Pet{
public:
	virtual void Speak(){cout<<"I don't no How to speak!"<<endl;};
};
class Cat:public Pet{
public:
	virtual void Speak(){cout<<"Miao~"<<endl;}
};
class Dog:public Pet{
public:
	virtual void Speak(){cout<<"Wang!!!"<<endl;}
};
void PlayWithPet(Pet& p){
	p.Speak();
}

int main(){
	Dog myDog;
	PlayWithPet(myDog);//输出Wang!!!
	return 0;
}

以上实现最简单的多态

废话不多说,下面深入研究多态的本质


(2-1)类的大小

#include "stdafx.h"

#define TRACE(a) a,cout<<#a"="<<a<<endl

#include<iostream>
using namespace std;

class C1{
	int i;
	void func1(){}
};
class C2{
	void func1(){}
	void func2(){}
	void func3(){}
	void func4(){}
};
class C3{
	void func1(){}
};

int main(){
	TRACE(sizeof(C1));
	TRACE(sizeof(C2));
	TRACE(sizeof(C3));
	return 0;
}
结果:



(2-2)有虚函数类的大小

#include "stdafx.h"

#define TRACE(a) a,cout<<#a"="<<a<<endl

#include<iostream>
using namespace std;

class Super{
public:
	virtual void func1(){}
};
class Sub1:public Super{
public:
	virtual void func1(){}
	virtual void func2(){}
	virtual void func3(){}
	void func4(){}
};
class Sub2:public Super{
public:
	virtual void func1(){}
	int i;
};

int main(){
	TRACE(sizeof(Super));
	TRACE(sizeof(Sub1));
	TRACE(sizeof(Sub2));
	return 0;
}

结果:


看出点眉目了吧。


由以上可以得出一个结论:如果一个类中有虚函数,不论虚函数的个数是多少,类的尺寸都要增加4。而且,即使其子类没有覆盖该虚函数,同样尺寸会增加4。可以将类Sub2中函数删掉会发现结果不变。

(3)VTable

增加的这个4是哪里来的呢?

很容易猜到是一个指针。32位系统中所有的指针大小都是4BYTE,char*、double*甚至一个结构或类的指针大小都是4。






c++(9)继承2

  • 2017年07月29日 14:42
  • 541KB
  • 下载

C++实验2:继承和派生

  • 2011年12月11日 15:01
  • 7KB
  • 下载

2013级C++第12周(春)项目——成员的访问属性、多重继承 【项目2 - 教师兼干部类】

/* * 程序的版权和版本声明部分 * Copyright (c)2014, 在校学生 * All rightsreserved. * 文件名称: 1.cpp * 作 者: 刘旺 * 完成日期...

C++第13周项目2 - 多重继承教师类和干部类

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijia...

继承与派生 编程题#2: 魔兽世界之二:装备(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;OpenJudge)

编程题#2: 魔兽世界之二:装备来源: POJ (http://cxsjsxmooc.openjudge.cn/test/E/)注意: 总时间限制: 1000ms 内存限制: 65536kB描述 魔...

C++继承(2) - 虚函数与运行时多态

下面就是运行时多态的简单例子。 #include using namespace std; class Base { public: virtual void show() { cout...
  • shltsh
  • shltsh
  • 2015年05月25日 09:08
  • 501

cocos2dx开发中的lua继承与覆盖C++方法

cocos2dx开发中的lua继承与覆盖C++方法 2013年9月23日发表评论阅读评论 前段时间开始学习cocos2d-x,后面会陆续写一些cocos2d-x方面的东西。由于...

C++:继承2(建筑物)

继承2(建筑物)Time Limit(Common/Java):1000MS/3000MS Memory Limit:65536KByte Total Submit:324 ...

cocos2dx lua继承C++类

这段时间用lua在做一个项目,用cocos2dx为基础来开发,采用lua脚本语言为核心语言。但是对lua几乎零基础的我,处处碰壁。首先了解到lua一般是用面向过程的方式来写脚本,并且看到cocos2d...

PKU C++程序设计实习 学习笔记2 继承与派生

第五章 继承与派生 5.1 继承和派生 继承和派生的概念 继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个基类,而把B作为基类的一个派生类(...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++继承(2)
举报原因:
原因补充:

(最多只允许输入30个字)