C ++将基本类型传递给纯虚函数

雷线

我想了解派生类中纯虚函数的行为,将其传递给与(抽象)基类相同类型的参数时。

为了澄清这个问题,我从GeeksForGeeks中获取了以下代码并对其进行了修改:

namespace example {
enum Type {ENGINEER, MANAGER};
class Employee
{
private:    
    const Type worker;
public:
    Employee(const Type& worker) : worker(worker) {}
    virtual ~Employee {}

    virtual void raiseSalary(const Employee&) = 0;
    {  /* common raise salary code */  }

    virtual void promote(const Employee&) = 0;
    { /* common promote code */ }
};

class Manager: public Employee {
    private:
        int degree;
    public:
        //<constructor>\\

    virtual void raiseSalary(const Employee&)
    {  /* Manager specific raise salary code, may contain
          increment of manager specific incentives*/  }

    virtual void promote(const Employee&)
    { /* Manager specific promote */ }
};

}

现在,我们如何才能访问degree派生类中的字段Manager以更新他的degree由于传递给的参数raiseSalary(Employee& employee)可能是ManagerEngineer

卵子

我认为有两种方法可以解决该问题。让我们从一个非常糟糕的解决方案开始:使用强制转换。在那种情况下dynamic_cast您可以尝试向下转换类型。如果dynamic_cast无法做到这一点,它将返回一个空指针或引发异常(取决于您转换的指针还是值/引用类型)。但是随着越来越多的经理,工程师类型的出现,这种方法将迫使您调整自己的演员表。您可能还需要使用friend来允许特定的类访问其他内部类。friend不会在层次结构中被继承,因此您最终将有很多朋友=>破碎,破碎,破碎:(

一种替代方法是使用“访客模式”:http : //en.wikipedia.org/wiki/Visitor_pattern使用访客模式,您还可以使基本的无操作访客和更细粒度的访客处理特定内容。只是一个小例子(没有特定派生的访客):

namespace example {

  class SalaryRaisingVisitor;
  class EmployeePromotingVisitor;

  class Employee
  {
  public:
      Employee() {}
      //don't forget to implement the copy constructor: read more about rule of 3!!!

      virtual ~Employee {}

      virtual void accept(SalaryRaisingVisitor const&) = 0;
      virtual void accept(EmployeePromotingVisitor const&) = 0;
  };

  class Manager: public Employee {
      private:
          int degree;
      public:
          //<constructorS>

      virtual void accept(SalaryRaisingVisitor const& v)
      {
        v.visit(*this, degree); 
      }

      virtual void accept(EmployeePromotingVisitor const& v)
      {
        v.visit(*this, degree);
      }
  };

  class Engineer: public Employee {
      public:
          //<constructorS>

      virtual void accept(SalaryRaisingVisitor const& v)
      {
        v.visit(*this); 
      }

      virtual void accept(EmployeePromotingVisitor const& v)
      {
        v.visit(*this);
      }
  };

  class SalaryRaisingVisitor
  {
    void visit(Manager& m, int& degree) //might be const if no internal state changes
    {
      //...
    }

    void visit(Engineer& e) //might be const if no internal state changes
    {
      //...
    }
  };

}

最后,在处理C ++时,请尝试避免使用虚函数:)并将所有内容移至静态多态性:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++将变量类型传递给函数

来自分类Dev

C ++将变量类型传递给函数

来自分类Dev

将C ++数学函数扩展到非基本类型

来自分类Dev

将C ++基本类型向量转换为Java基本类型数组

来自分类Dev

基本类型在C ++中也有构造函数吗?

来自分类Dev

从函数返回时的C ++基本类型降级

来自分类Dev

将任何对象类型传递给函数C ++

来自分类Dev

C# 将类类型传递给基构造函数

来自分类Dev

将类型传递给 C# 中的函数

来自分类Dev

OOP:将基本类型传递给需要对象的函数

来自分类Dev

C ++纯虚函数调用的性能差异

来自分类Dev

奇怪的行为C ++纯虚函数

来自分类Dev

D中的C ++ DLL(纯虚函数)

来自分类Dev

C ++ 11中的纯虚函数

来自分类Dev

D中的C ++ DLL(纯虚函数)

来自分类Dev

奇怪的行为C ++纯虚函数

来自分类Dev

关于纯虚函数的C ++设计原理?

来自分类Dev

将C变量传递给C ++函数

来自分类Dev

C ++将函数传递给函数

来自分类Dev

将函数传递给C ++中的函数

来自分类Dev

正确的Go类型传递给C函数?

来自分类Dev

C++ OOP 基本概念 - 将参数传递给构造函数

来自分类Dev

如何将C ++类转换为托管类并在其中调用纯虚函数?

来自分类Dev

将主体添加到C ++中的纯虚/抽象函数中?

来自分类Dev

在C#中应为通用接口基本类型时,如何传递方法参数?

来自分类Dev

基本类型的C ++类包装器

来自分类Dev

将Lua函数传递给C ++

来自分类Dev

C ++直接将数组传递给函数

来自分类Dev

将值传递给构造函数。C ++