簡體   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