C++ 如何通过构造参数来使用私有继承?
一些代码如下所示:C++ 如何通过构造参数来使用私有继承?,c++,C++,一些代码如下所示: class maven { private: string username; public: maven(string un) { username = un; } }; class car : private maven { public: /... do something .../ }; void baz(maven*); 然后,我希望在对象车中获得一个mave
class maven
{
private:
string username;
public:
maven(string un)
{
username = un;
}
};
class car : private maven
{
public:
/... do something .../
};
void baz(maven*);
然后,我希望在对象车中获得一个maven实例。
但是我如何用参数构造maven对象呢?
我已经查阅了规范和注释。在
car
中创建一个构造函数,并在初始化列表中初始化其基础maven
class car : private maven
{
public:
car(string un) : maven(un)
{
}
};
如果您的意思是如何构造
car
对象的maven
部分,请使用初始化列表执行此操作:
class car : private maven
{
public:
// This way
car() : maven("foo") {
}
// Or this way
car(string username) : maven(username) {
}
};
值得注意的是,这样您就不会在car
中获得maven
实例;实际上,car
本身在内心深处是一个maven
(尽管它没有告诉任何人)
除非出于某种原因需要访问maven
的受保护的成员,否则这种方法不是最好的。您可能需要考虑聚合类<代码> Maven < /C> >对象,例如:
class car
{
private:
maven m_maven;
public:
// Initialize the member with a default parameter
car() : m_maven("foo") {
}
// Or this way
car(string username) : m_maven(username) {
}
};
P> >请参阅C++ FAQ Lite作简短讨论。 < P>参见乔恩对私有继承和组成之间的区别的回答,但如果您想访问<代码> Maven 实例,因为,例如,有这样的函数:
class maven
{
private:
string username;
public:
maven(string un)
{
username = un;
}
};
class car : private maven
{
public:
/... do something .../
};
class car : private maven
{
public:
car() : maven("some_username")
{
}
};
void baz(maven*);
然后在这两种情况下,只有car
的成员和朋友才能访问maven
实例,因此给定car
的成员,例如car::zoo
:
在私人继承的情况下:
car::zoo(){ baz(this); }
或在组合的情况下:
car::zoo(){ baz(&m_maven); }
在这两种情况下,car
之外的其他函数或方法以及从car
派生的类中的方法都不能做到这一点。要求“继承”和“内部有实例”相互矛盾。你想要哪一个?我想要遗产。因为私有继承意味着实例与。继承意味着a是一种
关系,组合意味着a有一种
关系,所以选择一个。我的意思是有一个带参数的对象。另一个问题,如果我不想实例化一个对象,而是使用一个静态方法呢?这样,它是这样的:static static_method():maven(“foobar”){…}