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

本文详细解析了C++中的私有继承、保护继承、多重继承、名字冲突、钻石继承及虚继承的概念与实现机制。包括不同继承方式对成员访问权限的影响,以及在多重继承和钻石继承中如何解决成员重复和访问问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值