为什么派生类继承了基类的私有成员?

时间:2010-01-06 21:30:51

标签: c++

我知道派生类无法访问基类的私有成员,为什么派生类会继承基类的私有成员?有什么情况它有用吗?

谢谢!

9 个答案:

答案 0 :(得分:23)

派生类需要私有成员,即使它不能直接访问它们。否则它的行为不会建立在它派生的类上。

例如,假装私人内容是:

int i;

并且该类具有geti()和seti()。 i的值必须放在某处,即使它是私有的,

答案 1 :(得分:10)

基类的public和protected方法仍然可以访问基类的私有变量,这些方法在派生类中可用。

答案 2 :(得分:4)

基类仍然可以使用私有成员变量&方法

如果您希望派生类可以访问成员但是让这些成员对外部世界隐藏,请将它们protected:

以下是一个例子来说明:

class Base
{
public:
  Base() : val(42.0f) {};
  float GetValue() const 
  {
    return val_;
  }
private:
  float val_;
};

class Derived : public Base
{
public:
  float ComputedValue() const
  {
    return GetValue() * 2.0f;
  } 
};

答案 3 :(得分:4)

不要忘记基类可能具有非private的方法,因此派生类可以访问它们。那些protectedpublic基类方法仍然可以调用private基类方法。如果要锁定基类中的核心功能(例如使用Template Method设计模式实现),这将特别有用:

class base
{
public:

  virtual ~base() { /* ... */ }

  virtual void base_func() { foo_private (); }
  virtual void do_func() = 0;

private:

  void foo_private()
  {
    // pre-do_func() operations

    do_func();

    // post-do_function operations
  }

};

class derived : public base
{
public:

  void derived_func() { base_func(); }

  virtual void do_func()
  {
    // Derived class specific operations
  }
};

答案 4 :(得分:2)

原因是派生类与超类之间存在is-a关系。

派生类实例化是一个超类实例化...只是有更多(或更少,因为设置一些超类函数私有)的东西。

答案 5 :(得分:2)

正如其他答案所述,派生类在语法上无法访问基类的私有成员;但它需要在其内存布局中有相同的副本。想想铸造。使用'C'投射,您可以将派生到某个私人基地。然后编译器需要正确的内存偏移量,以便为基础对象生成有效的内存布局。

实施例。

class Base {
public: 
  void printA()  {
    a = 10;
    std::cout << a << std::endl;
  }
private:
  int a;
};
class Derived : private Base{
  int b;
};

Derived* d = new Derived;
Base* b = (Base*)d;
b->printA();

答案 6 :(得分:0)

派生类不会以任何方式“继承”基类的私有成员 - 它无法访问它们,因此它不会“继承”它们。

派生类的实例包含基类私有成员的实例,原因很明显。

所以我甚至不知道你的意思是什么。

答案 7 :(得分:0)

创建派生类对象时,还会调用基类构造函数来创建基础对象。如果没有为基类的私有成员分配内存,则基础对象将不完整。

因此,派生类对象继承了base的私有成员,因为它们是在创建基类对象期间创建的,但由于它们是私有的,因此无法访问。

答案 8 :(得分:0)

虽然私有成员不能从基类访问,但它们是由它们继承的,因为派生类在非私有函数的帮助下使用这些属性。

基类的私有成员不是直接访问的,而是由派生类的基类派生的。