Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10136
  • 博文数量: 6
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-29 18:10
文章分类
文章存档

2017年(6)

我的朋友
最近访客

分类: C/C++

2017-01-06 21:37:38

对于一般的继承,有三种继承方式,他们之间的区别如下:

(1)公有继承方式:

     基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。这里保护成员与私有成员相同。

     基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;基类的私有成员不可见,基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。

     基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见的。

    (2)私有继承方式:

     基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

     基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问;基类的私有成员不可见,派生类不可访问基类中的私有成员。

     基类成员对派生类对象的可见性对派生类对象来说,基类的所以成员都是不可见的。

     所以说,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

    (3)保护继承方式:

     这种继承方式与私有继承方式的情况相同,两者的区别仅在于对派生类的成员而言,基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

     基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见,基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员不可见,派生类不可访问基类中的私有成员。

     基类成员对派生类对象的可见性对派生类对象来说,基类的所以成员都是不可见的。

     所以说,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。


虚继承

虚继承的存在主要是为了解决多重继承中存在的二义性等问题。虚继承是一种机制,类通过虚继承指出它希望共享其虚基类的状态。在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。共享的基类子对象称为虚基类。

例如:

class A{int a;};

class B : public A

{int b;};

class C : public A

{int c;};

class D : public B,public C

{int a;};

类D的对象中就会出现两个类A部分,如果类B,C均是虚继承类A,则在D中只存在一个A类部分。

#include
using namespace std;
class A
{
    char k[3];
public:
    virtual void aa(){};
};
 
class B : public virtual A
{
    char j[3];
public:
    virtual void bb(){};
};
 
class C : public virtual B
{
    char i[3];
public:
    virtual void cc(){};
};
 
int main ()
{
    cout << "sizeof(A):" << sizeof(A) << endl;
    cout << "sizeof(B):" << sizeof(B) << endl;
    cout << "sizeof(C):" << sizeof(C) << endl;
    return 0;
}

输出结果为:

sizeof(A):8

sizeof(B):20

sizeof(C):32



****************************************************************
***************************************************************
************************************************************
********************************************************


一般继承:
class A
{
    char k[3];
public:
    virtual void aa(){};
};
 
class B : public  A
{
    char j[3];
public:
    virtual void bb(){};
};
 
class C : public B
{
    char i[3];
public:
    virtual void cc(){};
};
int main ()
{
    cout << "sizeof(A):" << sizeof(A) << endl;
    cout << "sizeof(B):" << sizeof(B) << endl;
    cout << "sizeof(C):" << sizeof(C) << endl;
    return 0;
}


输出结果为:

sizeof(A):8

sizeof(B):12

sizeof(C):16


******************************************************************

一些值得注意的地方:                                                                                                              **

对于一般继承,每个类都只有一个虚函数表,则只有一个指向虚函数表的指针。                       **

但对于多重继承,子类就可能有多个虚函数表,就有多个指向不同基类虚函数表的指针。         ***

对于虚继承,子类中还存在一个指向父类的指针。                                                                     * *  

**************************************************************



阅读(1333) | 评论(0) | 转发(0) |
0

上一篇:C_基础练习

下一篇:没有了

给主人留下些什么吧!~~