0

假设我有两个班级,ClassA 和 ClassB。

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

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

4

3 回答 3

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;
}
于 2012-10-31T23:07:06.130 回答
2

是的,您可以通过引用获取参数:

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

您将能够传递ClassAor的两个实例ClassB,并使用 RTTI 来确定它实际上是函数内部的类型。

或者,您可以将指针传递给ClassA,但在可能的情况下应优先使用引用。

于 2012-10-31T23:02:39.060 回答
0

这是一个有点间接的想法。该函数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);

    // ...
};
于 2012-10-31T23:23:23.527 回答