在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。 谢谢!
编辑:尝试使代码更清晰。
答案 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);
}