重写方法错误C++
Overriding Methods Error C++
我正在编写一个程序,在该程序中,我从C++中的另一个类继承并重写了几个方法。因为我只想在这些方法中添加一行,所以我尝试调用基类中的方法,并在它下面添加一行。我得到了以下错误。
"Unhandled exception at 0x00FA4456 in Ch.12.exe: 0xC0000005: Access violation reading location 0x67525A64."
这是我在java中最接近"super"的一次(据我所知(。
类的简化版本
using namespace std;
#include <iostream>
#include <string>
#include "dateType2.h"
class extDateType : public dateType
{
private:
string monthString;
void updateMonthString()
{
string months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
monthString = months[getMonth()];
}
public:
void printDateString()
{
string months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
cout << months[getMonth()];
cout << " ";
cout << getYear();
}
extDateType(int month, int day, int year)
{
dateType(month, day, year);
updateMonthString();
}
void addDays(int x)
{
dateType::addDays(x);
updateMonthString();
}
};
int main()
{
extDateType x(2, 25, 1996);
x.addDays(10);
x.printDateString();
system("pause");
return 0;
}
基本类的简化版本
using namespace std;
#include <iostream>
#include <string>
class dateType
{
private:
int dMonth;
int dDay;
int dYear;
bool isLeapYear;
public:
dateType(){}
void addDays(int x)
{
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
dDay += x;
for(int i = dMonth-1; dDay > days[i]; i++)
{
dDay -= days[i];
dMonth++;
if(dMonth == 13)
{
dMonth = 0;
dYear++;
}
i = i % 11;
}
}
dateType(int month, int day, int year)
{
isLeapYear = false;
int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(month > 0 && month <= 12)
{
if(month == 2)
{
if(year % 4 == 0)
{
isLeapYear = true;
if(day > 0 && day <= 29)
{
dMonth = month;
dDay = day;
dYear = year;
}
else
{
cout << "Error" << endl;
dMonth = 1;
dDay = 1;
dYear = 2000;
}
}
else
{
isLeapYear = false;
if(day > 0 && day <= 28)
{
dMonth = month;
dDay = day;
dYear = year;
}
else
{
cout << "Error" << endl;
dMonth = 1;
dDay = 1;
dYear = 2000;
}
}
}
else
{
if(day > 0 && day <= days[month-1])
{
dMonth = month;
dDay = day;
dYear = year;
}
else
{
cout << "Error" << endl;
dMonth = 1;
dDay = 1;
dYear = 2000;
}
}
}
else
{
cout << "Error" << endl;
dMonth = 1;
dDay = 1;
dYear = 2000;
}
}
};
使用Visual Studio 2012。如果有人能帮我找出问题所在,我们将不胜感激
extDateType(int month, int day, int year)
{
dateType(month, day, year);
这是解决您问题的方法,请用下面的替换上面的。
extDateType(int month, int day, int year)
:dateType(month, day, year)
{
前者只是创建一个未使用的临时对象,然后在执行该行后将其销毁,而后者则正确地调用基类构造函数。如果您删除了dateType(){}
,这可能会导致编译器错误,那么这可能会更加明显。
由于基类构造函数未被正确调用,因此在调用updateMonthString
时,行monthString = months[getMonth()];
包含一个数组,该数组访问月份的未初始化的大垃圾值作为索引因此崩溃。
后一种语法称为初始化列表。这是初始化没有默认(无参数(构造函数的基类和成员对象的正确方法。
此外,addDays
在Java中也不会像您所期望的那样工作。你需要了解一个叫做虚拟函数的概念。默认情况下,所有(非静态(函数在Java中都是virtual
,但您需要通过执行以下手动使它们在C++中成为虚拟函数
class dateType
{
...
virtual void addDays(int x){
//^^^^^^^
...
};
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'