【问题标题】:C++ function that depends on base class to obtain results on derived class依赖基类获取派生类结果的C++函数
【发布时间】:2013-09-13 13:43:38
【问题描述】:

在 c++ 中,将派生类传递给函数/方法,代替基类,并且仍然拥有派生类的信息? 例如:假设我有一个基类:“几何”和其他一些类:“形状”形式,我派生出“矩形”和“圆形”。

double area::geometry( shape& object, int i )
    { 
    if i = 1:
        rectangle thisObject = object;
        double side1 = thisObject.getheight();
        double side2 = thisObject.getwidth();
    if i = 2: 
        circle thisObject = object;
        double side1 = thisObject.radius * thisObject.radius;
        double side2 = 3.14;
    return side1 * side2;
    }

问题是你必须假设“return side1 * side2”是一个非常复杂的代码,我不想重复。所以我更喜欢根据函数的输入类型来设置问题,而不是重载它。

这个想法与这个非常相似:Is it possible to pass derived classes by reference to a function taking base class as a parameter。 谢谢!

编辑:试图使代码更清晰。

【问题讨论】:

  • 我感觉 XZ 有问题...
  • @KerrekSB:XZ 问题是不是你有一个问题 Z,你认为解决方案是 Y,所以你问如何做与 Y 无关的 X? ;)
  • 希望问题很清楚:我不想重载函数,因为代码实际上是相同的。我给出了一个部分解决方案,因为我虽然可以这样解决,这就是为什么它可能是 XZ 问题。谢谢你的回答!

标签: c++ overloading


【解决方案1】:

如果func 需要知道ob 在你传入时是什么类型,“你做错了”。多态性的全部意义在于所有对象在外部观察者看来都是相同的,但在内部做不同的事情。典型的例子是动物:

#include <iostream>

using namespace std;

class Animal
{
  public:
    virtual void Say() = 0;
};

class Dog : public Animal
{
  public:
    void Say() { cout << "Woof Woof" << endl; } 
};

class Pig : public Animal
{
  public:
    void Say() { cout << "All animals are equal, but pigs are "
                         "more equal than other animals" << endl; }
};

class Cat : public Animal
{
  public:
    void Say() { cout << "Meow, Meow" << endl; };
};


void AnimalTalk(Animal *a[], int size)
{
   for(int i = 0; i < size; i++)
   {
     a[i]->Say();
   }
}


int main()
{
   Cat c;
   Pig p;
   Dog d;
   Animal* list[3] = { &p, &c, &d };

   AnimalTalk(list, 3);
}

【讨论】:

  • 不能有引用数组,也不能有指向引用的指针。
  • @KerrekSB:我觉得它看起来有点可疑,所以我已经编译并修复了代码......
  • @MatsPetersson 这是一个微妙的拖钓还是你只是在编辑时错误地复制粘贴了它? ;)
  • @PetrBudnik:我一定是在复制粘贴时出错了……现在应该可以了。
  • 谢谢。现在我也可以 +1 了。只是因为我也碰巧认为猪比其他动物更平等。
【解决方案2】:

通常的方法是使用多态性:

void func(const base& ob)
{
  ob.doSomethingPolymorphic();
}

其中doSomethingPolymorphic()base 的虚成员函数。

【讨论】:

  • 我明白了,问题是 ob.doSomethingPolymorphic() 将与不同的类相关,而实际上是 func 为每个派生类做不同的事情。说:func = area 是几何学中的一种方法,它被应用于派生类:类形状中的“三角形和圆形”,所以我希望 area(shapes) 计算三角形和圆形的面积。
  • @Alejandro 所以你打电话给ob.area();
猜你喜欢
  • 2015-07-07
  • 1970-01-01
  • 2018-05-02
  • 2012-03-08
  • 1970-01-01
  • 2010-11-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多