私人继承是否总是意味着"HAS-A"?

Edu*_*yan 12 c++ inheritance implementation noncopyable

根据我最喜欢的作者斯科特迈耶斯先生的说法,私人继承和组合意味着同样的事情,即Has-A关系.因此,可以通过私有继承获得从组合中获得的所有东西(包含A类,其中A类具有B类成员),反之亦然.

所以下面的代码应该是Has-A关系,但从我的观点来看,它不是!

class A : private boost::noncopyable {.. this is irrelevant };
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我,我失踪了吗?或者如何通过合成实现此代码?

vll*_*vll 15

您的示例可以通过以下组合实现:

class A {
private:
    class B {
        B(const B&) = delete;
        B& operator=(const B&) = delete;
    } b;
};
Run Code Online (Sandbox Code Playgroud)

A是不可复制的,因为其成员b是不可复制的.


dbu*_*ush 6

你的例子仍然是一个HAS-A关系.

给出以下类作为示例,大致相当于boost:noncopyable:

class X {
private:
    X(const X &);
    X &operator=(const X &);
public:
    X() {}
};
Run Code Online (Sandbox Code Playgroud)

以下两个类具有相同的功能:

class A : private X {
public:
    int a;
    char b;
};

class B {
public:
    int a;
    char b;
    X x;
};
Run Code Online (Sandbox Code Playgroud)

在这个例子中,A从私下继承XB包含的一个实例X. A无法复制,因为它无法调用父的复制构造函数,并且B无法复制,因为它无法调用其成员之一的复制构造函数.

A a1;
A a2(a1);   // error
B b1;
B b2(b1);   // error
Run Code Online (Sandbox Code Playgroud)