c++ - 覆盖方法错误 C++

标签 c++ exception inheritance visual-studio-2012

我正在编写一个程序,其中我从 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()]; 涉及数组访问 < strong>large uninitialized junk value of month 作为索引。 因此崩溃

后一种语法称为initialization lists是初始化没有默认(无参数)构造函数的基类和成员对象的正确方法。

此外,addDays 不会像您在 Java 中期望的那样工作。您需要阅读名为 Virtual Functions 的概念.默认 all (non-static) functions are virtual in Java ,但您需要通过执行以下操作在 C++ 中手动将它们设为虚拟

class dateType
{

    ...
    virtual void addDays(int x){
  //^^^^^^^
    ...

};

关于c++ - 覆盖方法错误 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207402/

相关文章:

c++ - std::tuple 相当于 std::pair 的第二个成员?

c++ - 在 C++ 中引发异常和处理某些异常类型的正确方法是什么

java - 是什么导致了 java.lang.ArrayIndexOutOfBoundsException 以及如何防止它?

java - Spring MVC : With SimpleMappingExceptionResolver, 向 View 传递了哪些参数

c# - 继承通用抽象

c++ - 在 C++ 中访问重写的父虚方法

python - 棘手的模型继承 - Django

c++ - 如何从MSI包中读取产品代码?

c++ - 在 OpenMP for 循环中调用函数

c++ - move 构造函数可以接受类本身以外的参数吗?