C ++继承:受保护的变量不可用

时间:2015-02-02 20:38:30

标签: c++ inheritance protected

我在XCode中获得了以下C ++代码,给出了两个我无法理解的错误:

#include <iostream>


class Buch{
public:
    Buch (long int nummer = 0, char autor[25] = (char*)"", int jahr = 0, bool ausgel = false);

    long int getNr();
    int getJahr();

protected:
    long int __nummer;
    char     __autor[25];
    int      __jahr;
    bool     __ausgel;

    void setAusl(bool x);
    bool getAusl();
};

class FachBuch : Buch {
public:
    void setSWort(int sw);
    int getSWort();

protected:
    char     __fach[15];
    int      __swort;
};

class UBuch : Buch {
public:
    void setAlter(int a);
    int getAlter();

protected:
    int      __kateg;
    char     __land[15];

private:
    int _ab_alter;
};

class Bildband : UBuch {
public:
    Bildband(long int nummer = 0, char autor[25] = (char*)"", int jahr = 0, int kategorie = 0, char land[15] = (char*)"");
};

Buch::Buch (long int nummer, char autor[25], int jahr, bool ausgel) {
    __nummer = nummer;
    //_autor = autor;
    __jahr = jahr;
    __ausgel = ausgel;
}

long int Buch::getNr() {
    return __nummer;
}

int Buch::getJahr() {
    return __jahr;
}

void Buch::setAusl(bool x) {
    __ausgel = x;
}

bool Buch::getAusl() {
    return __ausgel;
}


void FachBuch::setSWort(int x) {
    __swort = x;
}

int FachBuch::getSWort() {
    return __swort;
}


void UBuch::setAlter(int x) {
    _ab_alter = x;
}

int UBuch::getAlter() {
    return _ab_alter;
}

Bildband::Bildband(long int nummer, char autor[25], int jahr, int kategorie, char land[15]) {

    __nummer = nummer; // error message: Cannot cast 'Bildband' to its private base class 'Buch'

    //Buch(nummer, autor, jahr, false); // error message: '__nummer' is a private member of 'Buch'

}

int main () {
    Bildband Masuren(356780, (char*)"Kranz", 2010, 4, (char*)"Polen");
    return 0;
}

我收到以下错误: main.cpp:92:5:无法投射&#39; Bildband&#39;到其私人基地&#39; Buch&#39; main.cpp:92:5:&#39; __ nummer&#39;是Buch&#39;

的私人会员

我对C ++的了解非常有限,我没有运气谷歌搜索,可能主要是因为我缺乏必要的C ++基础知识。

有人可以向我解释为什么会出现这些错误以及我需要查看哪些术语来理解这个问题?

提前致谢。

3 个答案:

答案 0 :(得分:8)

它们不可用,因为UBuch私下继承Buch 。定义类时,默认情况下继承是私有的。

// These two lines mean the same thing:
class UBuch : Buch
class UBuch : private Buch

Buch的所有成员都是继承的,但UBuch可见的成员将作为私有继承到UBuch

这意味着UBuch外部的代码无法访问BuchUBuch对象上的UBuch成员,也无法将指针或对Buch个对象的引用转换为指针或引用UBuch

这包括派生class Bildband : UBuch

的类
Buch

即使UBuch位于继承链中,其成员也由Bildband私下继承,因此Buch无法访问从Buch继承的成员。< / p>

要解决此问题,您应该公开继承class UBuch : public Buch (并且您可能希望所有其他类也从其各自的基类公开继承):

__nummer

另请注意,包含两个连续下划线的标识符由环境保留,因此代码中的所有此类标识符(__autor,{{1}}等)都会导致未定义的行为

答案 1 :(得分:1)

如果未定义访问说明符,编译器将默认为类的私有继承。简单地在你的UBuch课程和Buch课程上添加“public”,如下所示:

// ...
class UBuch : public Buch {
// ...
class Bildband : public UBuch {

我在这里假设“公开”,因为我猜你想要提供对来自BildBand用户的getNr / getJahr等方法的访问。

./问候 弗洛里安

答案 2 :(得分:1)

编辑:见下面的评论

继承成员的继承效果类型:

公开继承意味着只继承公共成员。

受保护继承意味着公共成员被继承,受保护成员也被继承为受保护成员。

私有继承意味着公共成员被继承,受保护成员被继承为私有。

默认情况下,您将私下继承。