我有以下代码片段:
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()
的输出正在输出垃圾。我错过了一些非常明显的东西吗?
任何帮助将不胜感激!
答案 0 :(得分:4)
您的程序有未定义的行为。您正在使用的DerivedClass
的默认构造函数不会初始化year
成员。
如果要初始化基本成员,可以通过调用适当的基础构造函数或直接指定值来实现。
DerivedClass() { year = 1999; }
答案 1 :(得分:2)
类BaseClass
的默认构造函数
BaseClass(){}
不会初始化数据成员date
和year
当您创建对象派生
时,默认构造函数由类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