vs 2008 c++ C++虚函数及其继承、虚继承类大小

电脑杂谈  发布时间:2018-01-10 16:06:17  来源:网络整理

vs2008 nullptr_vs 2008 c++_sqlserver2008使用教程

一、虚函数与继承

1、空类,空类单继承,空类多继承的sizeof

结果为:

sizeof(Base1) = 1 sizeof(b1) = 1

sizeof(Base2) = 1 sizeof(b2) = 1

sizeof(Derived1) = 1 sizeof(d1) = 1

sizeof(Derived2) = 1 sizeof(d1) = 1

可以看出所有的结果都是1。

2、含有虚函数的类以及虚继承类的sizeof

虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。

假设我们有这样的一个类:

class Base {

public:

virtual void f() { cout << "Base::f" << endl; }

virtual void g() { cout << "Base::g" << endl; }

virtual void h() { cout << "Base::h" << endl; }

};

当我们定义一个这个类的实例,Base b时,其b中成员的存放如下:

指向虚函数表的指针在对象b的最前面。

虚函数表的最后多加了一个结点,这是虚函数表的结束结点,就像字符串的结束符"\0"一样,其标志了虚函数表的结束。这个结束标志的在不同的编译器下是不同的。vs 2008 c++在WinXPVS2003下,这个是NULL。而在Ubuntu 7.10 Linux 2.6.22 GCC 4.1.3下,这个是如果1,表示还有下一个虚函数表,如果是0,表示是最后一个虚函数表。

因为对象b中多了一个指向虚函数表的指针,而指针的sizeof是4,因此含有虚函数的类或实例最后的sizeof是实际的数据成员的sizeof加4。

下面将讨论针对基类含有虚函数的继承讨论

(1)在派生类中不对基类的虚函数进行覆盖,同时派生类中还拥有自己的虚函数,比如有如下的派生类:

class Derived: public Base
{

public:

virtual void f1() { cout << "Derived::f1" << endl; }

virtual void g1() { cout << "Derived::g1" << endl; }

virtual void h1() { cout << "Derived::h1" << endl; }

};

基类和派生类的关系如下:

当定义一个Derived的对象d后,其成员的存放如下:

vs2008 nullptr_sqlserver2008使用教程_vs 2008 c++

可以发现:

1)虚函数按照其声明顺序放于表中。

2)父类的虚函数在子类的虚函数前面。

此时基类和派生类的sizeof都是数据成员的sizeof加4。

(2)在派生类中对基类的虚函数进行覆盖,假设有如下的派生类:

class Derived: public Base
{

public:

virtual void f() { cout << "Derived::f" << endl; }

virtual void g1() { cout << "Derived::g1" << endl; }

virtual void h1() { cout << "Derived::h1" << endl; }

};


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-59585-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 屈蕊蕊
      屈蕊蕊

      让女性普便比男性更有钱

    热点图片
    拼命载入中...