是什么让预告和预测非法

时间:2016-03-17 09:17:05

标签: c++ downcast

在讲座期间,一些学生说这种向上倾斜和向下倾斜缺乏逻辑并且是非法的。一些老师如何感到困惑和同意,并表示他将重新审查并再次做讲座,但我不知道这个代码有什么问题,并且有一种情况,这将是非法的。

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; }

2 个答案:

答案 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