在这个例子中,我创建了基础对象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;
}
答案 0 :(得分:3)
那仅仅是运气&#34;。您正在调用对象上的函数,而假装它是另一种类型(Ball
是Sphere
,但并非所有Sphere
都是Balls
,而且肯定是{{1}} ISN&#39; T)。这是未定义的行为,可以做任何事情,包括烘烤你的猫。小心。
答案 1 :(得分:1)
该函数不是虚函数,因此它只是被强制为Ball *
的对象指针类型调用。 &#39; Ball&#39; class直接和非虚拟地从'Sphere&#39;并且没有额外的基类,所以 - 幸运的你! - Sphere::radius
中相对于球*this
的{{1}}成员位置正确无误,您获得了正确的输出。