c++ - 多态与向下转型

标签 c++ inheritance casting polymorphism

假设我有一个基类 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/

相关文章:

c++ - 显式调用基类析构函数/构造函数是否合法?

java - 在父类(super class)对象中使用子类对象

java ;将基类转换为派生类

C++ 无效的指针值

c++ - 为什么会这样? operator= 和复制构造函数

c# - DerivedClass 作为 ParentClass 类型变量的值

java - 为什么 Java 让你强制转换为集合?

c++从long转换为float奇怪的错误

c++ - 是否可以在不必派生自 safe_bool 类的情况下实现 safe bool 习语?

c++ - 递归搜索 C++ 调用图以查找特定函数