在讲座期间,一些学生说这种向上倾斜和向下倾斜缺乏逻辑并且是非法的。一些老师如何感到困惑和同意,并表示他将重新审查并再次做讲座,但我不知道这个代码有什么问题,并且有一种情况,这将是非法的。
ApplicationInsights
编辑: 抓住上面的代码,这是我正在努力的事情,但是有人指出内存泄漏正在发生(愚蠢的我没有看到)这里是新的代码现在我只想知道它是否合法? (动态演员是在这之后教的所以没有动态演员的例子请)
#include <iostream>
using namespace std;
class base {
public:
int a,b;
base(){
a=0;
b=1;}
};
class derived : public base {
public:
int c,d;
derived(){
c=2;
d=3;
}
};
int main(){
derived der;
base baseob;
derived *derptr=new derived;
derptr=(derived*)&baseob;
base *baseptr=new base;
baseptr=&der;
}
用于预测
#include <iostream>
using namespace std;
class Employee
{
public:
Employee(string fName, string lName, double sal)
{
FirstName = fName;
LastName = lName;
salary = sal;
}
string FirstName;
string LastName;
double salary;
void show()
{
cout << "First Name: " << FirstName << " Last Name: " << LastName << " Salary: " << salary<< endl;
}
void addBonus(double bonus)
{
salary += bonus;
}
};
class Manager :public Employee
{
public:
Manager(string fName, string lName, double sal, double comm) :Employee(fName, lName, sal)
{
Commision = comm;
}
double Commision;
double getComm()
{
return Commision;
}
};
预告
int main() { Employee e1("Ali", "Khan", 5000); //object of base class
//try to cast an employee to
Manager Manager* m3 = (Manager*)(&e1); //explicit downcasting
cout << m3->getComm() << endl; return 0; }
答案 0 :(得分:2)
如果你是向下转换,你必须确保正在转换的对象的运行时类型确实是目标类型。当您将指向baseob
的指针转换为指向derived
的指针时,您对类型系统起了犯规作用,因为现在您有一个指向derived
的指针,指向derived
}。
答案 1 :(得分:2)
无论泄漏内存,这都不是推荐的投射方式。提供的示例使用C样式转换,虽然它们有效,但很容易导致未定义的行为(如果类型层次结构不匹配)。
通过baseptr=&der;
进行上传很方便,但更常见的是简单地说:
base* baseptr = new derived();
如果创建的对象属于派生类,这将始终有效。
应通过dynamic_cast
进行向下转换,例如:
base* baseptr = new base();
derived* derptr = dynamic_cast<derived>(baseptr); // will fail, derptr == nullptr
如果指针无法强制转换为派生(实际上是基于扩展的)类,dynamic_cast
将返回nullptr。你应该检查一下。在上面的示例中,转换将失败,derptr == nullptr
将解析为true
。