[英]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.