如何通过构造参数来使用私有继承?

时间:2011-06-26 15:40:40

标签: c++

有些代码如下:

class maven
{
private:
        string username;
public:
        maven(string un)
        {
            username = un;
        }
};

class car : private maven
{
public:
       /... do something .../
};

然后我想在对象车中获得一个maven实例。 但是如何用参数构造maven对象呢? 我查阅了规范和注释。

4 个答案:

答案 0 :(得分:5)

如果您的意思是如何构造maven对象的car部分,请使用初始化列表执行此操作:

class car : private maven
{
public:
    // This way
    car() : maven("foo") {
    }

    // Or this way
    car(string username) : maven(username) {
    }
};

值得注意的是,这样您就无法在maven内获得car个实例;实际上,car本身就是一个maven内部(尽管它并没有告诉任何人)。

除非您出于某种原因需要访问maven的{​​{1}}成员,否则这种做事方式并不是最好的。您可能需要考虑聚合protected的对象,例如:

maven

有关简短讨论,请参阅C ++ FAQ lite的this page

答案 1 :(得分:2)

car中创建一个构造函数,并在初始化列表中初始化其基础maven

class car : private maven
{
public:
    car(string un) : maven(un)
    {

    }
};

答案 2 :(得分:0)

class car : private maven
{
public:
    car() : maven("some_username")
    {
    }
};

答案 3 :(得分:0)

请参阅Jon的答案,了解私有继承和组合之间的区别,但是如果您想访问maven实例,因为有这样的函数:

void baz(maven*);

然后在这两种情况下,只有car的成员和朋友才能访问maven个实例,因此car的成员例如car::zoo

在私有继承的情况下:

car::zoo(){ baz(this); }

或在组成的情况下:

car::zoo(){ baz(&m_maven); }

在这两种情况下,car之外没有其他函数或方法,也没有car派生的类中的方法可以做到这一点。