在此示例中,我創建基礎對象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;
}
是不是未定義的行爲很好? – user657267
您可以使用C++ cast而不是c-cast。這裏'dynamic_cast','ballPtr'將是'nullptr'。 – Jarod42
@ Jarod42這裏使用'dynamic_cast'會導致編譯時錯誤,因爲'Sphere'不是多態的。 – user657267