重写方法错误C++; 我编写了一个程序,在这个程序中,我继承了C++中的另一个类,并重写了两个方法。因为我只想给这些方法添加一行,所以我尝试在基类中调用该方法并在其下面添加一行。我犯了以下错误 "Unhandled exception at 0x00FA4456 in Ch.12.exe: 0xC0000005: Access violation reading location 0x67525A64."

重写方法错误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

这是我在java中最接近“超级”的一次(据我所知)

课程的简化版本

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只是直接在子实例上调用该方法(而不是通过父引用/指针)。