c ++私有类继承

时间:2015-06-01 11:54:06

标签: c++ inheritance

请原谅我的英语技能;因为我不是母语人士。

我从大学教科书中得到了这段代码,我很难理解它几个小时......

#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;
}

以下是我的理解:

class derived将class base作为private继承,因此class base中的所有内容都是私有的。无法从子类访问afaik私有成员。 所以,1号,2号不会起作用。 class grandderived也将类derived作为私有继承,因此3,4和5也不会出于同样的原因。

但答案告诉我只有3号和4号不会工作,其他人会工作。 我编译了它,是的它告诉我同样的事情。

我是否误解了继承如何运作,或者还有其他我不知道的事情?

4 个答案:

答案 0 :(得分:3)

我相信这就是发生的事情:

  1. base类声明setashowa为受保护且公开的。这意味着子类可以访问它们。

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

  3. derivedgrandderived之间出现相同的模式。

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

答案 1 :(得分:1)

你关闭了。

grandderived继承自derived并将其标记为私有。但是,这意味着从derived继承的类将无法访问从grandderived继承的方法。以同样的方式,derived继承自base,将其标记为私有。

效果是grandderived 可以访问derived但不base的方法。

答案 2 :(得分:1)

derived类私有地继承base类,这意味着base类的所有公共成员和受保护成员在派生类中变为私有

即使它是私有继承,private也可以访问base的所有受保护和公共成员。所以1号和2号工作。

base::seta是受保护的成员,在derived的范围内变为私有。 grandderived无法访问derived个私人会员,因此第3和第4人无法工作。

derived::setb,数字5,在类derived中声明受保护时起作用。虽然它在grandderived的范围内变为私有,但它本身是可访问的。它不能进一步继承。

答案 3 :(得分:0)

正如您可以访问private成员但其他人无法访问,您可以访问private基类,但其他人不能。这就是为什么课程derived可以访问base::seta,但课程gradderived可以访问。

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