在C ++中继承私有成员

时间:2010-04-20 15:34:43

标签: c++ inheritance

假设一个类有私有数据成员,但是setter和getter在公共范围内。如果从此类继承,您仍然可以调用这些setter和getter - 允许访问基类中的私有数据成员。这怎么可能,因为提到派生类不能继承私有数据成员

7 个答案:

答案 0 :(得分:27)

派生类不会将访问继承到私有数据成员。但是,它确实继承了一个完整的父对象,该对象包含该类声明的任何私有成员。

答案 1 :(得分:8)

这取决于继承类型。如果您私下继承,则派生类无权访问Base的私有成员。

Access                      public     protected    private
-----------------------------------------------------------
members of the same class      yes           yes        yes
members of derived classes     yes           yes         no
not members                    yes            no         no

答案 2 :(得分:4)

因为getter和setter是public - 所以任何人都可以调用它们,而不仅仅是派生类。

答案 3 :(得分:2)

您可以通过设置对setter和getter的访问权限来访问它们,并像这样访问它们

*.h


class Mamifere
{
private:
    int a;
public:
    Mamifere();
    virtual ~Mamifere();
    int getA();
    // ~Mamifere(); //le delete dans le exp02() affiche seulement mamifere mort :( destructeur de la class mere 
    void manger() ;
    virtual void avancer() const;
};


class Deufin:public Mamifere{
public:
    Deufin();
    void manger() const;
    void avancer() const;
    ~Deufin();
};




*.cpp

Mamifere::Mamifere(){
        printf("nouveau mamifere est nee\n");
        this->a=6;
    }

Mamifere::~Mamifere(){
        printf("mamifere Mort :(\n");
    }
void Mamifere::manger() {
    printf("hhhh   je mange maifere %d\n",Mamifere::getA());
    }
void Mamifere::avancer() const{
    printf("allez-y Mamifere\n");
}

Deufin::Deufin(){
    printf("nouveau Deufin  est nee\n");
}
int Mamifere::getA(){
    return this->a;
}
void Deufin::manger() const{
    printf("hhhh   je mange poisson\n");

}
void Deufin::avancer() const{

    printf("allez-y Deufin\n");
}

Deufin::~Deufin(){
    printf("Deufin Mort :(\n");
}



main.cpp





void exp031(){
    Mamifere f;//nouveau mamifere est nee   //   nouveau Deufin  est nee
    Deufin d;

    f.avancer();//allez-y Deufin (resolution dynamique des lien  la presence de mot cle virtual)
    f.manger();//hhhh   je mange maifere (resolution static des lien pas de mot cle virtual)
    printf("a=%d\n",d.getA());//Deufin Mort :(   mamifere Mort :( (resolution static des lien  la presence de mot cle virtual) distructeur de class fille appel auromatiquement le destructeur de la class mere


}

int main(){
    exp031();

    getchar();
    return 0;
}

答案 4 :(得分:0)

Getters和setter不会让您完全控制私有数据成员。控件仍然在于基类。

答案 5 :(得分:0)

使用模式

class MyClass {
  private: int a;
  public: void setA(int x) { a = x; }
  public: int getA() const { return a; }
};

似乎是面向对象的,并且已经发送了封装。

然而正如您所注意到的那样,您仍然可以直接访问私有字段,而且只需将a公开并直接访问即可获得。

使用这样的getter和setter在C ++中没有任何意义。

答案 6 :(得分:0)

它们是包含的,但不是继承的。这意味着什么:

  • 任何继承类型(public static void SplitFil(int rows, string inputFile) { int outFileNumber = 1; const int MAX_LINES = 50000; string header = ""; if (GetFileSize(inputFile) > MAX_LINES) { var reader = File.OpenText(inputFile); while (!reader.EndOfStream) { var start_idx = 0; var writer = File.CreateText($"filename_{outFileNumber}.csv"); if (outFileNumber > 1) { writer.WriteLine(header); start_idx = 1; } for (int idx = start_idx; idx < MAX_LINES; idx++) { var row = reader.ReadLine(); if (idx == 0 && outFileNumber == 1) header = row; writer.WriteLine(row); if (reader.EndOfStream) break; } writer.Close(); outFileNumber++; } reader.Close(); } } : public SomeClass甚至是: protected SomeClass,等效于: SomeClass)都会使它们可以从子类方法访问,或在外部(分别为: private SomeClassthis->a);
  • 它们仍然会存在-占用分配给子类实例的内存空间;
  • 继承的方法将能够访问该私有字段。

因此,基本上someobject.a在外部不可见,而在内部和派生类中可见(如果未使用protected),而: private Parent在派生类和外部都不可见父类的;它仅对父类的方法可见,即使它们是继承的(但不能覆盖)。