假设我有两个班级,ClassA 和 ClassB。
ClassB 继承了 ClassA,并且有一些额外的函数和变量。
我是否可以制作一个可以接受 ClassA 或 ClassB 作为同一参数的函数,并让我确定使用了哪一个?
假设我有两个班级,ClassA 和 ClassB。
ClassB 继承了 ClassA,并且有一些额外的函数和变量。
我是否可以制作一个可以接受 ClassA 或 ClassB 作为同一参数的函数,并让我确定使用了哪一个?
将函数参数声明为指针或对ClassA
实例的引用(不要按值传递它,否则输入实例将在运行时被切片)。然后,您可以dynamic_cast
在需要访问ClassB
特定功能时使用。例如:
class ClassA
{
public:
int a;
virtual ~ClassA() {}
void DoSomething();
};
class ClassB : public ClassA
{
public:
int b;
void DoSomethingElse();
};
void func(ClassA *obj)
{
int a = obj->a;
obj->DoSomething();
ClassB *objB = dynamic_cast<ClassB*>(obj);
if (objB)
{
int b = objB->b;
objB->DoSomethingElse();
}
}
int main()
{
ClassA a;
func(&a);
ClassB b;
func(&b);
return 0;
}
是的,您可以通过引用获取参数:
void foo(ClassA& x) //or const ClassA
您将能够传递ClassA
or的两个实例ClassB
,并使用 RTTI 来确定它实际上是函数内部的类型。
或者,您可以将指针传递给ClassA
,但在可能的情况下应优先使用引用。
这是一个有点间接的想法。该函数Consumer::accept
同时接受 typeA
和 type的对象B
,并且特定的行为由这些类而不是您的使用者实现。
struct Consumer;
struct A
{
virtual ~A() { }
virtual int use(Consumer &);
};
struct B : A
{
virtual int use(Consumer &);
};
struct Consumer
{
void accept(A & x)
{
int n = x.use(*this);
do_more_stuff(n);
}
void do_more_stuff(int);
// ...
};