![](/img/trans.png)
[英]Base class on the initialisation list of a derived class' copy constructor (C++)
[英]C++ derived class and base copy constructor as pointer
我有一個基礎 class aaa
和兩個派生類bbb
和ccc
。
是否可以先聲明基礎 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;
}
但是b
和c
顯然無法訪問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
相同的方法,做同樣的事情。
您的b
和c
仍然有單獨a
子對象,但現在它們可能共享相同的realA
object,即真正起作用的 class。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.