如何为一个函数参数接受多个类?

时间:2012-10-31 23:00:30

标签: c++

假设我有两个类,ClassA和ClassB。

ClassB继承ClassA,并有一些额外的函数和变量。

我是否可以创建一个可以接受ClassA或ClassB作为相同参数的函数,并让我确定使用了哪一个?

3 个答案:

答案 0 :(得分:2)

是的,你可以参考参考:

void foo(ClassA& x) //or const ClassA

您将能够传递ClassAClassB的两个实例,并使用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);

    // ...
};