2015-11-15 171 views
1

当被问到B类的私有成员是否由D继承而来,一个从B派生出来的类时,人们强调说:是的,它们是继承的,但不能直接访问,只能间接通过基类中的公共方法。好的,但差异之间没有被继承和不能直接访问?例如,类X(不是从B衍生而来)也可以通过B的公共方法访问B的私有成员,即使X不从B继承任何东西。 1)未被继承和 2 )被继承并且不能直接访问。 什么不明确?私有成员的继承

+0

您可以在http://en.cppreference.com/w/cpp/language/access上阅读更多有关辅助功能的内容。 –

+0

不错,除了我的问题不是关于访问,它是关于被继承的意义 –

+0

您可能想(a)用相关代码和更直接的问题更新问题,或者(b)用相关代码创建新问题,更直接的问题。 –

回答

2

区别在于班级布局。

struct B { 
    private: char buf[1024]; 
}; 

struct D : B { }; 

这里,sizeof(D)> = sizeof(B)。它仍然有那里,即它明显地继承。

1

如果基类具有可以由派生类被覆盖虚函数,显然这是一个能够访问一个基类实例类的一个重要区别,但不从它继承:

class B 
{ 
public: 
    virtual ~B() {} 

    int get_a() const 
    { 
     do_something(); 
     return a; 
    } 

    virtual void do_something() const 
    { 
     std::cout << "In B\n"; 
    } 

private: 
    int a{}; 
}; 

class D : public B 
{ 
    virtual void do_something() const 
    { 
     std::cout << "In D\n"; 
    } 
}; 

int main() 
{ 
    D d; 
    d.get_a(); 
} 

如果基类没有任何虚函数,那么从它继承的有用性就不太清楚了。事实上,最好不要从它继承(至少是公开的),因为缺少虚拟析构函数可能会导致一些问题,而应该将其作为成员变量。

+0

我想你误解了我的帖子。问题是:私有数据成员是否被继承?为了争论,让我们假设他们不是(但仍然可以通过mutators/accessor间接访问)。那么会有什么不同呢? –

+0

@JKay我不明白。如果私人成员没有被继承,那么访问者会去哪里获取数据? –

+0

作为Base成员的访问者(公共方法)有权访问(Base的)私有数据成员。 –