在此示例中,我创建基础对象sphere(2),并通过类型转换将其地址分配给派生类指针。然后,我可以调用基础对象sphere(2)中不存在的fun()函数。而且我认为这很奇怪,因为这根本不是Sphere中fun()的定义。但是我可以进行类型转换并调用它。有人可以解释吗?
提前致谢。

PS:输出为“哈哈,我是半径2的球”

//---------sphere.h--------------
#ifndef SPHERE_H
#define SPHERE_H

class Sphere{
    private:
        double _radius;
    public:
        Sphere(double radius){
            _radius = radius;
        }
        double getRadius(){
            return _radius;
        }
};

#endif
//-----------ball.h--------------
#ifndef BALL_H
#define BALL_H

#include <iostream>
#include "Sphere.h"

using namespace std;

class Ball : public Sphere
{
    private:
        string _ballName;
    public:
        Ball(double radius, string ballName): Sphere(radius){
            _ballName = ballName;
        }

        string getName(){
            return _ballName;
        }

        void fun(){
            cout << "Haha I am a ball with radius " << getRadius() << endl;
        }
        void displayInfo(){
            cout << "Name of ball: " << getName()
                        << " radius of ball: " <<  getRadius() << endl;
        }
};

#endif
//-------main.cpp----------------
#include "Ball.h"
#include "Sphere.h"

int main(){
    Ball *ballPtr;
    Sphere sphere(2);

    ballPtr = (Ball *)&sphere;
    ballPtr -> fun();

    return 0;
}

最佳答案

那仅仅是“运气”。您在假装对象的函数是另一种类型时对其进行调用(BallSphere,但并非所有Sphere都是Balls,但肯定不是)。这是未定义的行为,可以执行任何操作,包括烘烤猫。小心。

关于c++ - 从基类中调用基类中不存在的派生方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24950833/

10-10 14:47