分类: 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类部分。
sizeof(A):8
sizeof(B):20
sizeof(C):32
输出结果为:
sizeof(A):8
sizeof(B):12
sizeof(C):16
一些值得注意的地方: **
对于一般继承,每个类都只有一个虚函数表,则只有一个指向虚函数表的指针。 **
但对于多重继承,子类就可能有多个虚函数表,就有多个指向不同基类虚函数表的指针。 ***
对于虚继承,子类中还存在一个指向父类的指针。 * *
****************************************************************
***************************************************************
************************************************************
********************************************************
{
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(){};
};
******************************************************************