C++ C++;是否可由父类访问?

C++ C++;是否可由父类访问?,c++,class,inheritance,public,C++,Class,Inheritance,Public,这些规则规定,在公共说明符的情况下,派生类的对象可以被视为基类的对象(反之亦然)。这是什么意思 所有公共元素(在任何类中)都可以被任何地方访问吗 这是否意味着对于父类,派生类可以访问定义为public的属性和方法。但是如果派生类中的属性和方法是公共的,那么父/基类就不能访问它们 In a public base class Base class members How inherited base class members appear in derive

这些规则规定,在公共说明符的情况下,派生类的对象可以被视为基类的对象(反之亦然)。这是什么意思

所有公共元素(在任何类中)都可以被任何地方访问吗

这是否意味着对于父类,派生类可以访问定义为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

但是反过来呢

这意味着如果你有
Bar
,那是
Foo
的派生类

class Foo

class Bar : public Foo
所以你可以说,正如预期的那样

Foo* myFoo = new Foo;
Bar* myBar = new Bar;
您还可以从
Bar
创建
Foo
,因为
Bar
Foo的一种类型

Foo* myOtherFoo = new Bar;
您不能从
Foo
生成
,这就是“派生类的对象可以被视为基类的对象(反之亦然)”的意思


我想正确的问题是:C++中派生类的CAN <强>成员< /强>(不是对象)可以被父类访问吗? 派生类可以访问基类的公共成员和受保护成员(数据成员和函数)

可以从任何地方访问类的公共成员。当然,它们需要通过该类的实例进行访问

但是如果派生类中的属性和方法是公共的,那么父/基类就不能访问它们了

如果您有派生类的实例,则它们可以是。然后可以从基类访问派生类的公共成员


编辑:

基类成员访问派生类的公共成员的示例,反之亦然

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();
}
你问:

< C++中派生类的对象是否可以被父类访问?

对。下面是我见过几次的模式

你还问:

所有公共元素(在任何类中)都可以被任何地方访问吗

当然可以

基类访问派生类成员的示例模式

实体h:

class Attribute;

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

   private:
      Attribute* att_;
};
属性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();
}

如何从父类方法的代码访问子类(非继承的、非虚拟的)成员?如果我有一个
类循环
。我举了一个
圆圈r的例子访问公共属性radius是
r.radius
。如果我在我的主要部分中写这个,那么属性必须是公共的。如果我想在派生类中访问相同的
radius
,为什么我不能这样做呢。由于该方法/成员是公开的?简单回答是的,他们可以。更好的问题是“他们应该吗?”。事实上,这被认为是闻起来很像一个设计,需要重新思考,除了在一些非常罕见的和专门的情况下,甚至可能不是那样…他们可能不应该。但我试图了解所有适用的规则-可以做什么-因此涵盖了所有场景。这就是为什么我不能确定上面的vise versa语句。所以,如果我理解正确,您不能从Foo访问Bar。因为在本质上,Foo不是酒吧的一种。但我的困惑在于公共变量的情况。如果某个东西是公共的,则可以从main或任何其他随机函数访问它。为什么一个随机函数不能访问来自Foo的条呢?因为它不知道它实际上是一个
条。当我说
Foo*myOtherFoo=newbar
那么所有公开使用
myOtherFoo
的人只知道它是
Foo
。它也恰好是一个
,但没有人知道这一点。对于
Bar*myBar=newbar,您只能将其视为
Bar
条的指针
。你可以从任何地方访问类的状态公共成员。我想知道为什么派生类中的方法不能访问父类的成员。这就是我的困惑所在。他们当然可以。我就是这么说的。下面是一个示例,其中派生类成员访问基类的公共成员,而基类成员访问派生类的公共成员。类基类{public:void funcBase();};派生类:公共基{public:void funcDerived();};void Base::funcBase()。因此基类可以访问派生类中的方法。非常感谢。
#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();
}