从派生类访问基类中的受保护成员

时间:2014-07-06 22:40:09

标签: c++ class protected derived-class

我有以下代码片段:

const int DATE_LENGTH = 6;

class BaseClass {
    protected:
        int date[DATE_LENGTH];
        int year;
    public:
        BaseClass(){}
        BaseClass(int *d) {
            for (int i = 0; i < DATE_LENGTH; i++) { date[i] = d[i];}
            year = 1900 + date[4] * 10 + date[5];
        }
        void printYear() {
            cout << year << endl;
        }
};

class DerivedClass : public BaseClass {
    public:
        DerivedClass() {}
        void printYear() {
            cout << year << endl;
        }
};

int main(int argc, char *argv[]) {
    int dob[] = {1, 6, 1, 0, 9, 0};
    BaseClass base(dob);
    base.printYear(); // prints 1990

    DerivedClass derived;
    derived.printYear(); // prints 1439156608
}

我无法理解为什么派生类中printYear()的输出正在输出垃圾。我错过了一些非常明显的东西吗?

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

您的程序有未定义的行为。您正在使用的DerivedClass的默认构造函数不会初始化year成员。

如果要初始化基本成员,可以通过调用适当的基础构造函数或直接指定值来实现。

DerivedClass() { year = 1999; }

答案 1 :(得分:2)

BaseClass的默认构造函数

BaseClass(){}

不会初始化数据成员dateyear

当您创建对象派生

时,默认构造函数由类DerivedClass的默认构造函数调用
DerivedClass derived;

因此,这些数据成员具有任意值,并且您的程序具有未定义的行为。

按以下方式更改派生类

class DerivedClass : public BaseClass {
    public:
        using BaseClass::BaseClass;
        DerivedClass() {}
        void printYear() {
            cout << year << endl;
        }
};

并创建派生为

的对象
DerivedClass derived( dob );

或者您可以自己在使用声明中明确定义类DerivedClass中的构造函数,该构造函数具有一个类型为int *的参数,并调用基类的相应构造函数。例如

class DerivedClass : public BaseClass {
    public:
        DerivedClass() {}
        DerivedClass( int *d ) : BaseClass( d ) {}
        void printYear() {
            cout << year << endl;
        }
};

答案 2 :(得分:0)

其他提供的答案仅涉及部分问题,部分原因是 date 本身在DerivedClass默认构造函数中定义的 never 当前提供的,另一部分是BaseClass默认构造函数仍然没有任何类变量(日期或年份)的定义值。如果使用以下代码,则取决于默认日期和年份,DerivedClass实际上不需要进行任何其他更改。

#include <iostream>

using namespace std;

const int DATE_LENGTH = 6;

class BaseClass {
    protected:
        int date[DATE_LENGTH];
        int year;
    public:
        BaseClass()
        {
            int date[] = {1, 6, 1, 0, 9, 0};
            year = 1900 + date[4] * 10 + date[5];
        }
        BaseClass(int *d)
        {
            for (int i = 0; i < DATE_LENGTH; i++) { date[i] = d[i];}
            year = 1900 + date[4] * 10 + date[5];
        }
        void printYear() {
            cout << year << endl;
        }
};

class DerivedClass : public BaseClass {
    public:
        DerivedClass() {}
        void printYear() {
            cout << year << endl;
        }
};

int main(int argc, char *argv[])
{
    int dob[] = {1, 6, 1, 0, 9, 0};
    BaseClass base(dob);
    base.printYear(); // prints 1990

    DerivedClass derived;
    derived.printYear(); // prints 1439156608
    return 0;
}

应用程序输出

1990
1990