c++私有类继承

c++ private class inheritance

本文关键字:继承 c++      更新时间:2023-10-16

请原谅我的英语水平;因为我的母语不是英语。

我从我的大学课本上得到了这个代码,我花了几个小时才理解它。

#include<iostream>
using namespace std;
class base{
    int a;
protected:
    void seta(int a){this->a=a;}
public:
    void showa(){cout<<a;}
};
class derived: private base{
    int b;
protected:
    void setb(int b){this->b=b;}
public:
    void showb(){
        seta(5); //1
        showa(); //2
        cout<<b;
    }
};
class grandderived: private derived{
    int c;
protected:
    void setab(int x){
        seta(x); //3
        showa(); //4
        setb(x); //5
    }
};
int main(){
    return 0;
}
以下是我到目前为止的理解:

derived作为私有继承了类base,因此类基中的所有内容都是私有的。Afaik私有成员不能从子类访问。所以,1,2不行。类grandderived也继承了类derived作为私有,因此3,4和5也将不能工作。

但是答案告诉我只有3号和4号不行,其他的都可以。我编译了它,是的,它告诉我相同。

我是否误解了继承的工作方式,或者还有其他我不知道的事情?

我相信事情是这样的:

  1. base类将setashowa声明为protected和public。

  2. derived继承自base。这意味着它可以访问base(包括setashowa)中受保护和公开的所有内容。它私有继承base的事实意味着继承的成员将被标记为私有,因此不能在子类化derived(即grandderived)的类中访问。

  3. 同样的模式在derivedgrandderived之间发生。

因此:derived可以访问base的方法,grandderived可以访问derived的方法,但不能访问base的方法。

你很接近了。

grandderived继承自derived并将其标记为private。然而,这意味着从derived继承的方法将不能从继承grandderived的类中访问。同样,derived继承自base,将其标记为private。

结果是grandderived 可以访问derived而不能访问base的方法。

derived类私有继承base类,这意味着base类的所有public和protected成员在派生类中都变为private

尽管private是私有继承,但它可以访问base的所有受保护成员和公共成员。所以表述1和2是正确的。

base::seta是base中的受保护成员,在derived的作用域中变为private。grandderived不能访问derived的私有成员,因此3和4不能工作。

derived::setb,编号5,它在derived类中被声明为受保护。尽管它在grandderived的作用域中是私有的,但它本身是可访问的。它不能再遗传下去了。

就像你可以访问你的private成员而其他人不能一样,你可以访问你的private基类而其他人不能。这就是为什么derived类可以访问base::seta,而gradderived类不能。

private继承的主要作用是派生类型的对象不能(从类外部)强制转换为基类类型。