在此示例中,我创建基础对象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;
}
最佳答案
那仅仅是“运气”。您在假装对象的函数是另一种类型时对其进行调用(Ball
是Sphere
,但并非所有Sphere
都是Balls
,但肯定不是)。这是未定义的行为,可以执行任何操作,包括烘烤猫。小心。
关于c++ - 从基类中调用基类中不存在的派生方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24950833/