重写方法错误C++; 我编写了一个程序,在这个程序中,我继承了C++中的另一个类,并重写了两个方法。因为我只想给这些方法添加一行,所以我尝试在基类中调用该方法并在其下面添加一行。我犯了以下错误 "Unhandled exception at 0x00FA4456 in Ch.12.exe: 0xC0000005: Access violation reading location 0x67525A64."
这是我在java中最接近“超级”的一次(据我所知) 课程的简化版本重写方法错误C++; 我编写了一个程序,在这个程序中,我继承了C++中的另一个类,并重写了两个方法。因为我只想给这些方法添加一行,所以我尝试在基类中调用该方法并在其下面添加一行。我犯了以下错误 "Unhandled exception at 0x00FA4456 in Ch.12.exe: 0xC0000005: Access violation reading location 0x67525A64.",c++,exception,inheritance,visual-studio-2012,C++,Exception,Inheritance,Visual Studio 2012,这是我在java中最接近“超级”的一次(据我所知) 课程的简化版本 using namespace std; #include <iostream> #include <string> #include "dateType2.h" class extDateType : public dateType { private: string monthString; void updateMonthString() { string
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;
}
使用名称空间std;
#包括
#包括
#包括“dateType2.h”
类extDateType:公共日期类型
{
私人:
弦月弦;
void updateMonthString()
{
字符串月份[12]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
monthString=months[getMonth()];
}
公众:
void printDateString()
{
字符串月份[12]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
库特
这是您的问题的解决方案,请将上面的问题替换为下面的问题
extDateType(int month, int day, int year)
:dateType(month, day, year)
{
前者只是创建一个未使用的临时对象,然后在执行该行后销毁该对象,而后者则正确地调用基类构造函数。如果删除了会导致编译器错误的dateType(){}
,这可能会更明显
由于基类构造函数没有被正确调用,当调用updateMonthString
时,行monthString=months[getMonth()];
涉及数组访问一个大的未初始化垃圾值作为索引。因此崩溃
调用后一种语法是初始化没有默认(无参数)构造函数的基类和成员对象的正确方法
<> >代码> Addith.< /Cord>不会像你在Java中所期望的那样工作。你需要读取这个概念,默认情况下,但是你需要通过以下的手动地在C++中使java成为虚拟的
class dateType
{
...
virtual void addDays(int x){
//^^^^^^^
...
};
这是您的问题的解决方案,请将上面的问题替换为下面的问题
extDateType(int month, int day, int year)
:dateType(month, day, year)
{
前者只是创建一个未使用的临时对象,然后在执行该行后销毁该对象,而后者则正确地调用基类构造函数。如果删除了会导致编译器错误的dateType(){}
,这可能会更明显
由于基类构造函数没有被正确调用,当调用updateMonthString
时,行monthString=months[getMonth()];
涉及数组访问一个大的未初始化垃圾值作为索引。因此崩溃
调用后一种语法是初始化没有默认(无参数)构造函数的基类和成员对象的正确方法
<> >代码> Addith.< /Cord>不会像你在Java中所期望的那样工作。你需要读取这个概念,默认情况下,但是你需要通过以下的手动地在C++中使java成为虚拟的
class dateType
{
...
virtual void addDays(int x){
//^^^^^^^
...
};
你没有覆盖任何内容。@chris:addDays()我想是吧?@AdrianShum它不是虚拟的,那只是函数隐藏。@AdrianShum,我想你是想让它成为虚拟的。我考虑过你有其他人的可能性,但似乎不太可能。@KarthikT我认为它仍然在覆盖(我的意思是,他打算这么做)但这并不是正确的做法。然而,对于OP来说,即使这不是一个虚拟方法,也是导致问题的原因,因为OP只是直接在子实例上调用该方法(而不是通过父引用/指针)。您没有覆盖任何内容。@chris:addDays()我想是吧?@AdrianShum它不是虚拟的,那只是函数隐藏。@AdrianShum,我想你是想让它成为虚拟的。我考虑过你有其他虚拟的可能性,但似乎不太可能。@KarthikT我认为它仍然是最重要的(我的意思是,他打算这么做)但是,对于OP来说,即使这不是一个虚拟方法,也是导致问题的原因,因为OP只是直接在子实例上调用该方法(而不是通过父引用/指针)。