Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;继承:使用派生类的实例调用基类的虚拟函数 我试图了解C++中的强>虚函数和继承。在下面的示例代码中,我有两个类AreaCube(基类)和SideAreaRatio(派生类)。我试图从派生类中的另一个函数“ratio”调用基类中的虚拟函数“area”。我正试图通过使用基类的一个实例来实现这一点。但由于一些我不熟悉的原因,我看到了奇怪的答案。请告诉我这里发生了什么事 #include<iostream> using namespace std; class AreaCube { public: int side; AreaCube() {}; AreaCube(int s) { side = s; } virtual ~AreaCube() {}; virtual int area() { cout<< "calling.. " << endl; int area = side*side*side; return area; } }; class SideAreaRatio:public AreaCube { public: SideAreaRatio(int s) { side = s; }; ~SideAreaRatio() {}; float ratio() { AreaCube a; int area = a.area(); cout<< area << endl; return (side/area); } }; int main() { AreaCube* ac = new AreaCube(2); cout<< ac->area() << endl; SideAreaRatio* sar = new SideAreaRatio(4); cout<< sar->ratio() << endl; }_C++_Oop_Inheritance - Fatal编程技术网

C++;继承:使用派生类的实例调用基类的虚拟函数 我试图了解C++中的强>虚函数和继承。在下面的示例代码中,我有两个类AreaCube(基类)和SideAreaRatio(派生类)。我试图从派生类中的另一个函数“ratio”调用基类中的虚拟函数“area”。我正试图通过使用基类的一个实例来实现这一点。但由于一些我不熟悉的原因,我看到了奇怪的答案。请告诉我这里发生了什么事 #include<iostream> using namespace std; class AreaCube { public: int side; AreaCube() {}; AreaCube(int s) { side = s; } virtual ~AreaCube() {}; virtual int area() { cout<< "calling.. " << endl; int area = side*side*side; return area; } }; class SideAreaRatio:public AreaCube { public: SideAreaRatio(int s) { side = s; }; ~SideAreaRatio() {}; float ratio() { AreaCube a; int area = a.area(); cout<< area << endl; return (side/area); } }; int main() { AreaCube* ac = new AreaCube(2); cout<< ac->area() << endl; SideAreaRatio* sar = new SideAreaRatio(4); cout<< sar->ratio() << endl; }

C++;继承:使用派生类的实例调用基类的虚拟函数 我试图了解C++中的强>虚函数和继承。在下面的示例代码中,我有两个类AreaCube(基类)和SideAreaRatio(派生类)。我试图从派生类中的另一个函数“ratio”调用基类中的虚拟函数“area”。我正试图通过使用基类的一个实例来实现这一点。但由于一些我不熟悉的原因,我看到了奇怪的答案。请告诉我这里发生了什么事 #include<iostream> using namespace std; class AreaCube { public: int side; AreaCube() {}; AreaCube(int s) { side = s; } virtual ~AreaCube() {}; virtual int area() { cout<< "calling.. " << endl; int area = side*side*side; return area; } }; class SideAreaRatio:public AreaCube { public: SideAreaRatio(int s) { side = s; }; ~SideAreaRatio() {}; float ratio() { AreaCube a; int area = a.area(); cout<< area << endl; return (side/area); } }; int main() { AreaCube* ac = new AreaCube(2); cout<< ac->area() << endl; SideAreaRatio* sar = new SideAreaRatio(4); cout<< sar->ratio() << endl; },c++,oop,inheritance,C++,Oop,Inheritance,生成的输出: calling.. 8 calling.. 8 0.3333 calling.. 8 calling.. -1265467392 0 您正在使用默认构造函数创建的AreaCube的新实例a,该构造函数不会在实例a上设置side的值。此内存不能保证保存任何特定值,当您调用a.area()时,结果将是未定义的 有一个简单的修复方法:替换AreaCube a带有区域立方体a(侧面)并查看您是否获得了正确的行为。或者,您可以完全避免实例化AreaCube的新实例,只需直接调用基

生成的输出:

calling.. 
8
calling.. 
8
0.3333
calling.. 
8
calling.. 
-1265467392
0

您正在使用默认构造函数创建的
AreaCube
的新实例
a
,该构造函数不会在实例
a
上设置
side
的值。此内存不能保证保存任何特定值,当您调用
a.area()
时,结果将是未定义的

有一个简单的修复方法:替换
AreaCube a带有
区域立方体a(侧面)
并查看您是否获得了正确的行为。或者,您可以完全避免实例化
AreaCube
的新实例,只需直接调用基类方法:
int-area=AreaCube::area()
。请注意,这里不需要传递
,因为基类方法在当前对象的(
)状态下运行


另外,另一个问题将阻止此操作:当您分割两个
int
变量时,它将把结果截断为
int
。要执行浮点除法,您需要获取以下信息:replace
return(side/area)带有
返回(1.0f*大小/面积)
一切都应该正常。

您正在使用默认构造函数创建的
AreaCube
的新实例
a
,该构造函数不设置实例
a
上的
侧边的值。此内存不能保证保存任何特定值,当您调用
a.area()
时,结果将是未定义的

有一个简单的修复方法:替换
AreaCube a带有
区域立方体a(侧面)
并查看您是否获得了正确的行为。或者,您可以完全避免实例化
AreaCube
的新实例,只需直接调用基类方法:
int-area=AreaCube::area()
。请注意,这里不需要传递
,因为基类方法在当前对象的(
)状态下运行


另外,另一个问题将阻止此操作:当您分割两个
int
变量时,它将把结果截断为
int
。要执行浮点除法,您需要获取以下信息:replace
return(side/area)带有
返回(1.0f*大小/面积)一切都应该正常。

SideAreaRatio
类中,当调用
ratio
时,使用默认构造函数(
AreaCube()
)创建类型为
AreaCube
的新对象,该构造函数不会初始化类的
成员字段。接下来,继续对
SideAreaRatio
类中仍然未定义的
side

值执行计算,然后使用默认构造函数(
AreaCube()
)创建类型为
AreaCube
的新对象调用
ratio
时,不会初始化类的
成员字段。接下来,继续对
侧的未定义值执行计算

浮动比率()更改为

float ratio() {
    int area = area();
    cout<< area << endl;
    return (side/area);
}
浮动比率(){
int面积=面积();
不能将
浮动比率()更改为

float ratio() {
    int area = area();
    cout<< area << endl;
    return (side/area);
}
浮动比率(){
int面积=面积();

cout它不起作用,因为您实际上没有用任何值构造
AreaCube
对象,所以当它计算面积时,它会给您垃圾(因为
side
变量没有值,如调用默认构造函数所示)

我想你想做的是:

#include<iostream>
using namespace std;

class AreaCube {
public:
    int side;
    AreaCube() {};

    AreaCube(int s) {
        side = s;
    }
    virtual ~AreaCube() {};

    virtual int area() {
        cout<< "calling.. " << endl;
        int area = side*side*side;
        return area;
    }
};

class SideAreaRatio:public AreaCube {
public:
    SideAreaRatio(int s) {
        side = s;
    };

    ~SideAreaRatio() {};

    float ratio() {
        int area = area();
        cout<< area << endl;
        return (side/area);
    }
};

int main() {
    AreaCube* ac = new AreaCube(2);
    cout<< ac->area() << endl;
    SideAreaRatio* sar = new SideAreaRatio(4);
    cout<< sar->ratio() << endl;
}
#包括
使用名称空间std;
类AreaCube{
公众:
内侧;
AreaCube(){};
AreaCube(int s){
侧面=s;
}
虚拟~AreaCube(){};
虚拟整数区域(){

cout它不起作用,因为您实际上没有用任何值构造
AreaCube
对象,所以当它计算面积时,它会给您垃圾(因为
side
变量没有值,如调用默认构造函数所示)

我想你想做的是:

#include<iostream>
using namespace std;

class AreaCube {
public:
    int side;
    AreaCube() {};

    AreaCube(int s) {
        side = s;
    }
    virtual ~AreaCube() {};

    virtual int area() {
        cout<< "calling.. " << endl;
        int area = side*side*side;
        return area;
    }
};

class SideAreaRatio:public AreaCube {
public:
    SideAreaRatio(int s) {
        side = s;
    };

    ~SideAreaRatio() {};

    float ratio() {
        int area = area();
        cout<< area << endl;
        return (side/area);
    }
};

int main() {
    AreaCube* ac = new AreaCube(2);
    cout<< ac->area() << endl;
    SideAreaRatio* sar = new SideAreaRatio(4);
    cout<< sar->ratio() << endl;
}
#包括
使用名称空间std;
类AreaCube{
公众:
内侧;
AreaCube(){};
AreaCube(int s){
侧面=s;
}
虚拟~AreaCube(){};
虚拟整数区域(){
不能在这里

相反

或者你可以打电话

area() 
直接创建AreaCube的新对象,即

 float ratio() {

    return (side/area());
}
你打电话的原因是什么

area() 
直接的原因是这个方法是在基类中定义的。在这种情况下,即使它没有定义为虚拟的,你也可以使用它。你可以试试看,结果是一样的

基本上,您的代码不是虚拟函数的正确实现。

此处

float ratio() {
    AreaCube a;
    int area = a.area();
    cout<< area << endl;
    return (side/area);
}
相反

或者你可以打电话

area() 
直接创建AreaCube的新对象,即

 float ratio() {

    return (side/area());
}
你打电话的原因是什么

area() 
直接的原因是这个方法是在基类中定义的。在这种情况下,即使它没有定义为虚拟的,你也可以使用它。你可以试试看,结果是一样的


基本上,您的代码不是正确的虚拟函数实现。

使用调试器,您应该在几秒钟内找到问题。使用调试器,您应该在几秒钟内找到问题。不客气。当您从基类继承时,您可以