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

C++ function that depends on base class to obtain results on derived class

本文关键字:结果 C++ 函数 派生 基类 获取 依赖于      更新时间:2023-10-16

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

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

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

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

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

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

如果

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