假设我有两个类,ClassA和ClassB。
ClassB继承ClassA,并有一些额外的函数和变量。
我是否可以创建一个可以接受ClassA或ClassB作为相同参数的函数,并让我确定使用了哪一个?
答案 0 :(得分:2)
是的,你可以参考参考:
void foo(ClassA& x) //or const ClassA
您将能够传递ClassA
或ClassB
的两个实例,并使用RTTI来确定它实际位于函数中的类型。
或者,您可以将指针传递给ClassA
,但在可能的情况下,首选引用。
答案 1 :(得分:2)
将函数参数声明为指针或对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;
}
答案 2 :(得分:0)
这是一个有点间接的想法。函数Consumer::accept
接受A
类型和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);
// ...
};