[英]Inheritance of composition relationship in C++
我經常面對這個問題。 假設我有以下課程:
class B
{
public:
virtual std::string className(){return "B";}
};
class A
{
public:
A()
: _B(new B)
{}
virtual std::string className(){return "A";}
virtual void desc()
{
std::cout << "I am " << className() <<
" and I own: " << _B->className() << std::endl;
}
protected:
B * _B;
};
然后,我想用新信息擴展A
和B
我確信SuperA
和SuperB
分別與A
和B
具有“ is-a”關系。 直接的方法是嘗試繼承:
class SuperB: public B
{
public:
virtual std::string className(){return "SuperB";}
}
class SuperA: public A
{
public:
SuperA()
: A()
, _superB(new SuperB)
{}
virtual std::string className(){return "SuperA";}
virtual void desc()
{
std::cout << "I am " << className() <<
" and I own: " << _superB->className() << std::endl;
}
protected:
SuperB * _superB;
};
但這顯然不好,因為SuperA
實際上有兩個B
:一個來自A
類,另一個來自其SuperB
類。 而且desc
的覆蓋不是那么優雅。
我可以看到我可以在A
B*
上使用setter和getter,並在SuperA
覆蓋它們以使用SuperB
而不是B
,並且從不直接引用B*
並始終使用getter,但這似乎有點干擾A
嘗試SuperA
,即讓SuperA
擁有一個A*
實例看起來也不好。
如果A
不擁有單個B*
而是說std::vector<B*>
,那就變得更加困難。
這是個常見的問題嗎? 有沒有我看不到的優雅解決方案?
您可能只讓A
具有一個受保護的構造函數,該構造函數采用B*
:
class A {
public:
A()
: _B(new B)
{ }
protected:
A(B* b)
: _B(b)
{ }
};
以便:
class SuperA : public A {
public:
SuperA()
: A(new SuperB)
{ }
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.