欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++中那些不得不说的类继承

程序员文章站 2022-07-15 16:50:44
...

1、私有继承和保护继承
使用 private:方式继承父类,在父类中所有成员都会变成私有的。这种继承方式会防止父类的成员扩散

使用 protected: 方式继承父类,公开的成员便保护,这种继承方式有限的防止父类成员的扩散。
   禁止向上造型: 禁止向上进行类型转换(子类的指针或引用不能隐式转换成父类的指针或引用)。
    要想实现多态只能以公开方式继承父类。

2、多重继承
在C++中,一个子类可以有多个父类,在继承表中按照顺序继承多个父类中的属性和行为。
按照从低到高的地址顺序排列父类,子类中会标记每个父类存储的位置。
当子类指针转换成父类的隐式指针的时候,编译器会自动计算父类中的内存所在子类中的位置,地址会
自动进行偏移计算。
#include
using namespace std;
class A
{
public:
int a;
};
class B
{
public:
int b;
};
class C
{
public:
int c;
};
class Test:public A,public B,public C
{
public:
Test(void)
{
a=1;
b=2;
c=3;
}
};
int main()
{
Test* p=new Test;
A* ap=p;
B* bp=p;
C* cp=p;
cout<a<<" “<b<<” "<c<<endl;
}
2、名字冲突
如果父类中由同名的成员,不会造成继承错误(可以正常继承),但如果直接继承会造成歧义,域限定符
类名::成员名 。
3、钻石继承
假设有一个类A,类B继承类A,类C继承类A,类D继承B,C
一个子类继承多个父类,这些父类有一个共同的祖先,这种继承叫钻石继承。
注意:钻石继承不会导致继承错误,但访问A中成员时,每次都需要使用域限定符,这种继承方式会造成
冗余
#include
using namespace std;
class A
{
public:
int a;
};
class B:public A
{
};
class C:public A
{

};
class D:public B,public C 
{

};
int main()
{
    D d;
    cout<<d.B::a<<endl;
}

4、虚继承 virtual

注意:使用虚继承时子类中会多一些内容,指向从祖先类继承来的成员
构造函数:
    一旦进行了虚继承(虚继承中的钻石继承),祖先类的构造函数只执行一次,有孙子类直接调用。祖先类的有参构造,也需要在
        孙子类中显示调用
    拷贝构造:
        在虚继承中的祖先的拷贝构造也由孙子类直接调用,子类中不再调用。在实现的深拷贝构造时,祖先中的
            拷贝构造也由孙子类直接调用。赋值构造同理。