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”){…}