首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类引用另外两个类

类引用另外两个类
EN

Stack Overflow用户
提问于 2015-06-25 10:30:29
回答 3查看 71关注 0票数 2

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

代码语言:javascript
运行
复制
class A
{
    public:
        A();        
        void f();
};

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

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

    ??? obj;
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-25 10:35:25

也许您需要一个模板类:

代码语言:javascript
运行
复制
template <typename T>
class C
{
    T& obj;
    public:
        explicit C(T& t) : obj(t) {}
        void f() { obj.f(); }
};

然后:

代码语言:javascript
运行
复制
A a;
B b;
C<A> c1(a);
C<B> c2(b);
c1.f();
c2.f();
票数 5
EN

Stack Overflow用户

发布于 2015-06-25 10:42:08

C++是一种非常灵活的语言,因此为您所要求的内容提供了多种选项。每个人都有各自的优缺点。

想到的第一条路是使用多态性。您有两条路径可供选择:静态或动态多态。

静态多态路由

要使用静态多态性(也称为编译时多态性),您应该将C作为一个模板类:

代码语言:javascript
运行
复制
template <typename T> class C
{
    public:
        C(T&);

        T& obj;
}

动态多态路由

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

代码语言:javascript
运行
复制
class Fer
{
    public:
        virtual ~Fer() {}

        virtual void f() = 0;
}

哪个AB将实现:

代码语言:javascript
运行
复制
class A : public Fer
{
    public:
        A();        
        void f() overide;
};

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

然后,C将是这样的:

代码语言:javascript
运行
复制
class C
{
    public:
        C(Fer&);

        Fer& obj;
}

变体路线

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

其中的一些例子是:

  • Boost.Any
  • Boost.Variant
  • 来自Qt的QVariant

在使用此类类时,通常需要一些方法将其转换回实际类型,然后再对其进行操作。

票数 2
EN

Stack Overflow用户

发布于 2015-06-25 10:43:08

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

代码语言:javascript
运行
复制
class Base
{
    public:
        Base();
        virtual void f();
};

并且可以有实现接口的派生类。

代码语言:javascript
运行
复制
class A : public Base
{
    public:
        A();
        virtual void f();
};

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

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

代码语言:javascript
运行
复制
class C
{
    private:
        Base& base;

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

这样就可以很容易地使用了。

代码语言:javascript
运行
复制
int main()
{
    B b;
    C c(b);
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31047798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档