繁体   English   中英

C++ 派生 class 和基本复制构造函数作为指针

[英]C++ derived class and base copy constructor as pointer

我有一个基础 class aaa和两个派生类bbbccc

是否可以先声明基础 class 然后将其引用到其派生类,以使它们共享相同的引用?

为了说明我的意思,我写了这个小代码:

#include <iostream>
#include <functional>
#include <memory>

class aaa
{
    protected:

        int a;

    public:

        aaa(int _a)
        {
            a = _a;
        }

        aaa(aaa &_aaa) = default;
        aaa(aaa &&_aaa) = default;

        int get_a(void)
        {
            return a;
        }

        void set_a(int _a)
        {
            a = _a;
        }

        int *get_a_addr(void)
        {
            return &a;
        }
};

class bbb : public aaa
{   
    public:

        bbb(aaa &_aaa) : aaa(_aaa)
        {
            ;
        }

        bbb(aaa &&_aaa) : aaa(_aaa)
        {
            ;
        }
};

class ccc : public aaa
{
    public:

        ccc(aaa &_aaa) : aaa(_aaa)
        {
            ;
        }

        ccc(aaa &&_aaa) : aaa(_aaa)
        {
            ;
        }
};

int main(void)
{   
    aaa a(10);
    bbb b(std::ref(a));
    ccc c(std::ref(a));

    std::cout << "address of a" << std::endl;
    std::cout << a.get_a_addr() << std::endl;
    std::cout << b.get_a_addr() << std::endl;
    std::cout << c.get_a_addr() << std::endl;

    return 0;
}

但是bc显然无法访问a::a的相同 memory 区域。

据我所知,实现这一点的唯一方法是使用嵌套类。 不可能像我尝试的那样吗?

所有三个对象都有不同的 a 成员实例。 而且由于您在ˋget_a_addressˋ中返回ˋaˋ成员的地址而不是其内容,因此每个object的返回值不同。 我假设您希望为所有这些调用返回相同的值(ˋaˋ 对象的内容)。

不,每个基础 class 子对象都独立于所有其他子对象。 你能做的是有一个假基地 class,它唯一的工作就是参考真实的东西。

class realA
{
  void foo() { ... }
  void bar() { ... }
};

class a
{
   ...
   void foo() { impl->foo(); }
   void bar() { impl->bar(); }
   std::shared_ptr<realA> impl;
};

a行为与realA一样,因为它具有与realA相同的方法,做同样的事情。

您的bc仍然有单独a子对象,但现在它们可能共享相同的realA object,即真正起作用的 class。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM