-2

在 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”是一个非常复杂的代码,我不想重复。所以我更喜欢根据函数的输入类型来设置问题,而不是重载它。

这个想法与这个非常相似:是否可以通过引用以基类作为参数的函数来传递派生类。谢谢!

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

4

2 回答 2

3

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

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

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

于 2013-09-10T00:12:32.087 回答
3

如果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);
}
于 2013-09-10T00:24:09.090 回答