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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单继承多继承--问题解析相关的知识,希望对你有一定的参考价值。


 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




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

以上是关于单继承多继承--问题解析的主要内容,如果未能解决你的问题,请参考以下文章

单继承&多继承 注意点

多继承和代码块

继承接口staticabstract

Python Qt GUI设计入门模板类的单继承和多继承封装

python 单继承多继承菱形继承

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)