C ++函数依赖于基类来获取派生类的结果

时间:2013-09-10 00:09:55

标签: c++ overloading

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

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

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

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

2 个答案:

答案 0 :(得分:3)

通常的方法是使用多态:

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

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

答案 1 :(得分:3)

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

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