2014-10-10 112 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(); 
}