假设我有一个基类 Employee
和一个派生类 Manager
,如下所示:
class Employee
{
public:
string Name;
};
class Manager : public Employee
{
public:
string Designation;
};
在实现如下一些功能时:
Employee* SomeFunction(bool SomeCondition)
{
Employee *Emp = NULL;
if (SomeCondition)
{
//Code goes here : Both Implementation 1 and 2 work fine!
}
return Emp;
}
当 SomeCondition
为真时,我想返回一个 Manager
类型的非空对象。在这种情况下,以下两段代码似乎都符合要求:
实现 1:
Manager *Mng = new Manager;
Mng->Name = "Adam";
Mng->Designation = "BOSS";
Emp = Mng;
实现 2:
Emp = new Manager;
Manager *Mng = (Manager*)Emp;
Mng->Name = "Adam";
Mng->Designation = "BOSS";
既然两者都工作得很好,我想知道两者中哪一个效率更高?
哪个在使用多态性的概念?
实现 2 中的类型转换是向下转换吗?这是好的做法吗?
最佳答案
虽然我看到了你的问题背后的一些原因,但我认为你 需要改进你的例子
你是说你需要返回一个非空对象 类型为“经理”,而您定义“SomeFunction(bool SomeCondition)” 返回“员工”。
如果您确实要返回“Employee”对象,为什么还要麻烦 初始化“指定”,而您将无法访问它 之后。例如:
cout << SomeFunction(true)->Designation(); // error !
所以,我不确定说您的示例工作正常是什么意思, 因为上下文不清楚。
** 比较实现 1 和 2/关于动态转换
虽然两个示例都可以改进,但我认为实现 1 略有改进 更好的。在这两种情况下,您都进行动态转换。然而,在实现中 1,你在“Emp = Mng;”中进行了隐式向上转换,而在实现 2 中 你在“Manager Mng = (Manager)Emp;”中做向下转换。
一般来说,你应该避免转换(尤其是向下转换,因为它是 与 upcasting 相比并不总是那么安全),如果你必须 您应该使用 C++ 样式转换(例如 dynamic_cast)。见 例如在 https://www.tutorialcup.com/cplusplus/upcasting-downcasting.htm
更好的解决方案是使用虚函数以避免 类型转换并腾出空间以在“经理”旁边添加更多对象类型。 例如,您的 header 可能如下所示:
class Employee
{
public:
virtual void setDesignation(const string & d) = 0;
virtual string getDesignation() = 0;
};
class Manager : public Employee
{
public:
virtual void setDesignation (const string & d) {Designation=d;}
virtual string getDesignation() {return Designation;}
private:
string Designation;
};
您的函数可能如下所示:
Employee* SomeFunction(bool SomeCondition)
{
Employee *Emp = NULL;
if (SomeCondition)
{
Emp = new Manager;;
Emp->setDesignation("BOSS");
}
return Emp;
}
然后如果你想稍后访问指定,你可以这样做
cout << SomeFunction(true)->getDesignation();
** 关于多态
在这两个示例中都没有使用任何多态性。这是因为你不 使用特定于类型的任何函数,因此您的运行时行为不会 因“员工”对象而异(您仅使用一种对象类型 无论如何,“经理”!)。请参阅中的示例 http://www.tutorialspoint.com/cplusplus/cpp_polymorphism.htm
关于c++ - 多态与向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39170996/