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;
}

预期产量:

calling.. 
8
calling.. 
8
0.3333

产生的输出:

calling.. 
8
calling.. 
-1265467392
0
亚瑟·钱兹(ArthurChamz)

这是行不通的,因为您实际上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;
}

您不需要实例化AreaCube派生类内部的内容,因为所需的一切已经存在。只需调用该area()方法即可。

从基类继承时,将保留所有成员变量和成员函数,因此除了派生类外,您无需实例化其他任何东西。因此,在这种情况下,SideAreaRatio同时具有side变量和area()方法

值得一提的是,您实际上并没有使用该virtual方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

C++ 继承:基类类型的虚函数中派生类类型的参数

如何调用在C ++中具有抽象基类和派生类的定义的基类的虚函数定义?

C ++继承:指向基类的派生类指针调用派生类方法

在C ++继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数

在C ++中从派生类的析构函数调用虚函数

C++ 继承(在基类中实例化派生类)

C ++:用指向派生类的指针进行的虚函数调用是否仍具有vlookup

派生类中的C ++纯虚函数实现

C ++依赖于派生类的纯虚函数

带虚函数的C++派生类

在C ++中,公共继承基类调用派生类的私有虚拟功能

C ++多态性:派生类调用基类虚拟函数,而不是重写的派生类

Cython / Python / C ++-继承:将派生类作为参数传递给需要基类的函数

C++ 派生类调用函数

C#-在派生类中调用基类和类构造函数

在派生类 C++ 的构造函数中调用基类的构造函数

C ++派生类构造函数调用基类构造函数错误

C ++实现对派生类的实例进行计数的基类

如何在C ++中从基类构造函数调用派生类方法?

C# 可以让基类中的泛型函数知道调用派生类的类型吗?

C ++如何从多个派生类调用基类方法?

C ++:在派生类成员上调用基类方法

派生类的虚函数调用基类的虚函数

在 C# 中使用基类和派生类实例化数组中的对象

C ++多态性:是否可以使用从双重派生类到基类的函数?

如何使用基类的数据成员作为派生类的构造函数?(在 C++ 中)

如果只有C ++中的基类指针,则使用派生类参数重载函数

创建基类对象使用派生类构造函数c ++

C ++:使用基类中的仅派生类变量