类引用另外两个类

时间:2015-06-25 10:30:29

标签: c++

我有两个类,其中一些方法具有相同的名称。 我可以创建第三个类来接受来自其他两个的ony的引用,并在构造函数中将obj变量设置为A或B类型吗?

class A
{
    public:
        A();        
        void f();
};

class B
{
    public:
        B();        
        void f();
};

class C
{
    public:
        C(B&);
        C(A&);

    ??? obj;
};

3 个答案:

答案 0 :(得分:5)

也许你想要一个模板类:

template <typename T>
class C
{
    T& obj;
    public:
        explicit C(T& t) : obj(t) {}
        void f() { obj.f(); }
};

然后:

A a;
B b;
C<A> c1(a);
C<B> c2(b);
c1.f();
c2.f();

答案 1 :(得分:2)

C ++是一种非常灵活的语言,因此可以为您提供多种选择。每个人都有自己的利弊。

首先想到的是使用多态。 您有两种选择路径:静态或动态多态。

静态多态路线

要使用静态多态(也称为编译时多态),您应该使C成为模板类:

template <typename T> class C
{
    public:
        C(T&);

        T& obj;
}

动态多态路线

要使用动态(也称为运行时多态),您应该提供一个接口:

class Fer
{
    public:
        virtual ~Fer() {}

        virtual void f() = 0;
}

哪个AB会实施:

class A : public Fer
{
    public:
        A();        
        void f() overide;
};

class B : public Fer
{
    public:
        B();        
        void f() overide;
};

C就像这样:

class C
{
    public:
        C(Fer&);

        Fer& obj;
}

变体路线

有各种库提供可以安全保存任意类型的类。

这些的一些例子是:

使用这些类时,通常需要一些方法在操作之前转换回实际类型。

答案 2 :(得分:0)

您可以拥有一个定义所需接口的基类。

class Base
{
    public:
        Base();
        virtual void f();
};

您可以拥有实现该接口的派生类。

class A : public Base
{
    public:
        A();
        virtual void f();
};

class B : public Base
{
    public:
        B();
        virtual void f();
};

C然后引用Base类,实际上可以接受AB类型的对象。

class C
{
    private:
        Base& base;

    public:
        C(Base& b) : base(b) {}
};

它可以很容易地使用。

int main()
{
    B b;
    C c(b);
    return 0;
}