2014-10-10 95 views
1

該規則規定,在派生類的公共說明符(派生類對象)的情況下,可以將其視爲基類的對象(反之亦然)。那是什麼意思?C++中派生類的對象可以被父類訪問嗎?

任何/任何地方的所有公共元素都可以訪問嗎?

這是否指的是這樣一個事實,即父類的屬性和方法定義爲public可由派生類訪問。但是如果派生類中的屬性和方法是公共的,那麼它們不能被父類/基類訪問?

In a public base class 
Base class members     How inherited base class members appear in derived class 
private: x ------------------------> x is inaccessible 
protected: y ------------------------> protected: y 
public: z ------------------------> public: z 

但是反過來呢?

+0

如何從父類方法的代碼中訪問子類(非繼承,非虛擬)成員? – hyde 2014-10-10 15:46:21

+0

如果我有'班級圈子'。例如,我創建了一個「circle r」的實例,訪問公共屬性radius爲'r.radius'。如果我在主要部分中寫入該屬性,則屬性必須公開。如果我想在派生類中訪問相同的'radius',爲什麼我不能這樣做。既然該方法/成員是公開的? – YelizavetaYR 2014-10-10 15:58:20

+0

簡單的答案,是他們*可以*。更好的問題是「他們應該是?」。事實上,正在考慮這種氣味很像一個需要重新思考的設計,除非在一些非常罕見和特殊的情況下,甚至可能不是那樣...... – twalberg 2014-10-10 16:04:15

回答

1

我想正確的問題將是「用C派生類的成員不是對象)能++是由父​​類訪問?」

派生類可以訪問基類的公共和受保護成員(數據成員和函數)。

一個班的公共成員可以從任何地方訪問。當然,他們需要通過該類的一個實例來訪問。

但是,如果派生類中的屬性和方法是公共的,父類/基類不可訪問?

它們可以是,如果你有一個派生類的實例。然後您可以從基類訪問派生類的公共成員。


編輯:

實施例,其中基類成員訪問派生類的公共成員,並且反之亦然。

class Base 
{ 
    public: 
    void funcBase(); 
}; 

class Derived : public Base 
{ 
    public: 
    void funcDerived(); 

}; 

void 
Base::funcBase() 
{ 
    Derived d; 
    d.funcDerived(); 
} 

void 
Derived::funcDerived() 
{ 
    Base b; 
    b.funcBase(); 
} 

int main() 
{ 
    Base b; 
    Derived d; 

    b.funcBase(); 
    d.funcDerived(); 
} 
+0

你聲明 - **一個類的公共成員可以從任何地方訪問。**我這種情況下,派生類中的方法怎麼會無法訪問父類的成員。這就是我的困惑所在。 – YelizavetaYR 2014-10-10 15:54:44

+1

他們當然可以。這就是我所說的。下面是一個例子,其中派生類成員訪問基類和基類成員的公共成員訪問派生類的公共成員。 class base { public: void funcBase(); }; 類派生:public base { public: void funcDerived(); }; void Base :: funcBase() { Derived d; d.funcDerived(); } void Derived :: funcDerived() { Base b; b。funcBase(); } int main() { Base b; 派生d; b.funcBase(); d.funcDerived(); } – toutnom 2014-10-10 16:07:51

+0

我明白了。所以基類可以訪問派生類中的方法。謝謝。 – YelizavetaYR 2014-10-10 16:16:14

1

這意味着如果你有Bar這是一個派生類Foo

class Foo 

class Bar : public Foo 

因此可以這樣說,因爲預期

Foo* myFoo = new Foo; 
Bar* myBar = new Bar; 

您也可以從Bar一個Foo因爲Bar是一種類型的Foo

Foo* myOtherFoo = new Bar; 

你不能讓一個BarFoo,這就是「派生類的對象可以被視爲基類的對象s(反之亦然)「的意思。

Bar* myOtherBar = new Foo; 
+0

所以,如果我理解正確,你不能訪問Foo酒吧。因爲Foo本質上不是一種酒吧。但我的困惑在於公共變量。如果某些東西是公開的,可以從主要或任何其他隨機函數訪問。爲什麼不能有一個隨機函數訪問Bar來自Foo。 – YelizavetaYR 2014-10-10 15:51:40

+0

因爲它不知道它實際上是一個「酒吧」。當我說'Foo * myOtherFoo = new Bar'時,那麼所有公開使用'myOtherFoo'的人都知道它是'Foo'。它也恰好是一個「酒吧」,但沒人知道。你只能將它當作Bar'myBar = new Bar'的'Bar',因爲這實際上是一個指向Bar的指針。 – CoryKramer 2014-10-10 15:54:51

1

你問:

可以在C派生類對象++是由父​​類訪問?

是。看到下面我已經看過幾次的模式。

你還問:

所有公共元素(任何級別)可以通過任何訪問/地方?

是的,當然。基類訪問派生類成員的

實施例圖案

Entity.h:

class Attribute; 

class Entity 
{ 
    public: 
     Entity(Attribute* att); 
     void save(FILE* fp); 
     void print(); 

    private: 
     Attribute* att_; 
}; 

Attribute.h:

#include "Entity.h" 

class Attribute : public Entity 
{ 
    public: 
     void save(FILE* fp); 
     void print(); 

}; 

Entity.cc:

#include "Entity.h" 
#include "Attribute.h" // Needed to access Attribute member functions 

Entity::Entity(Attribute* att) : att_(att) {} 

void Entity::save(FILE* fp) 
{ 
    // Save its own data. 
    //... 

    // Save the Attribute 
    att_->save(fp); 
} 

void Entity::print() 
{ 
    // Print its own data to stdout. 
    //... 

    // Print the Attribute 
    att_->print(); 
} 
相關問題