从基类调用基类中不存在的派生方法

时间:2014-07-25 08:02:07

标签: c++ inheritance

在这个例子中,我创建了基础对象sphere(2),并将其地址分配给具有类型转换的派生类指针。然后我可以调用基础对象sphere(2)中不存在的fun()函数。而且我认为这很奇怪,因为这根本就没有球体中的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;
}

2 个答案:

答案 0 :(得分:3)

那仅仅是运气&#34;。您正在调用对象上的函数,而假装它是另一种类型(BallSphere,但并非所有Sphere都是Balls,而且肯定是{{1}} ISN&#39; T)。这是未定义的行为,可以做任何事情,包括烘烤你的猫。小心。

答案 1 :(得分:1)

该函数不是虚函数,因此它只是被强制为Ball *的对象指针类型调用。 &#39; Ball&#39; class直接和非虚拟地从'Sphere&#39;并且没有额外的基类,所以 - 幸运的你! - Sphere::radius中相对于球*this的{​​{1}}成员位置正确无误,您获得了正确的输出。