码迷,mamicode.com
首页 > 其他好文 > 详细

单继承、多继承--问题解析

时间:2016-03-12 23:15:56      阅读:437      评论:0      收藏:0      [点我收藏+]

标签:单继承、多继承、继承、c++、面试题、虚函数、virtual


 public、protectedprivate不仅是类中的访问限制符,在c++中“继承”中,它们还表示继承关系,public表示公有继承,protected表示受保护的,private表示私有的,如下图:

技术分享

    B类继承A类,我们称A类为基类(父类),称B类为派生类(子类),子类包括父类的成员变量和成员函数,三种继承关系基类成员在派生类中的访问关系变如下。

 技术分享


下面是以B继承A的详细代码:
//单继承    A->B
class A
{
public:
     void fun1()
     {
         cout << "A::fun1" << endl;
      }
      
private:
     int a;
};
 
class B : public A
{
public:
    void fun2()
    {
        cout << "B::fun2" << endl;
    }
 
private:
    int b;
};


     程序运行后,调用内存会发现子类B中有父类中的成员变量与成员函数,设b是类B的对象,用sizeof(b)求得的大小为8。

 

      说到“继承”就不免提到virtual这个关键字,对于成员函数的重写(覆盖),我们又应当怎样做呢?重写的概念是:当两个同名的函数(参数也相同)在不同的作用域中,这里指两个函数分别在父类和子类中,同时父类中的函数必须要求是虚函数,即就是在函数前面加上virtual的关键字,这就构成了虚函数的覆盖。


下面是虚函数覆盖:
class A
{
public:
    virtual void fun1()
    {
        cout << "A::fun1" << endl;
     }
     
private:
     int a;
};
 
class B : public A
{
public:
    void fun1()
    {
        cout << "B::fun1" << endl;
     }
 
private:
    int b;
};


既然有单继承就有多继承,多继承顾名思义就是子类有两个及两个以上的父类,即就是如下图所示:


技术分享

下面是具体的程序示例:
class A
{
public:
     virtual void fun1()
    {
        cout << "A::fun1" << endl;
    }
    
private:
     int a;
};
 
class B 
{
public:
    virtual void fun1()
    {
        cout << "B::fun1" << endl;
    }
 
    void fun2()
    {
        cout << "B::fun2" << endl;
    }
 
private:
    int b;
};
 
class C : public A, public B
{
public:
    void fun2()
    {
        cout << "C::fun2" << endl;
    }
 
    void fun3()
    {
        cout << "C::fun3" << endl;
     }
 
private:
    int c;
};


根据上面的多重继承示例,计算类C的对象从c1的大小为20,因为类A中存在虚函数,编译会自动产生一个虚函数指针,占4个字节的大小,B类也是同样,所以c1的大小为20个字节。下面是监视c1的结果:


技术分享


如若将类AB中的virtual去掉,则sizeof(c1)的大小为12,因为不会产生虚函数指针,其中类Cfun2不会覆盖类Bfun2




本文出自 “无心的执着” 博客,谢绝转载!

单继承、多继承--问题解析

标签:单继承、多继承、继承、c++、面试题、虚函数、virtual

原文地址:http://10740590.blog.51cto.com/10730590/1750262

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!