Can objects of derived classes in C++ be accessible by parent class?
规则规定,在公共说明符的情况下,派生类的对象可以被视为基类的对象(反之亦然)。那是什么意思?
所有公共元素(在任何类中)都可以被任何人/任何地方访问吗?
这是否意味着对于定义为public的父类属性和方法,派生类可以访问这些属性和方法。但是,如果派生类的属性和方法是公共的,那么父类/基类就不能访问它们?
1 2 3 4 5 | 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 |
但反过来呢?
你问:
Can objects of derived classes in C++ be accessible by parent class?
号
对。下面是我见过几次的模式。
你还问:
Can all public elements (in any class) be accessible by anything/anywhere?
号
是的,当然。
访问派生类成员的基类的示例模式
实体H:
1 2 3 4 5 6 7 8 9 10 11 12 | class Attribute; class Entity { public: Entity(Attribute* att); void save(FILE* fp); void print(); private: Attribute* att_; }; |
。
属性.h:
1 2 3 4 5 6 7 8 9 | #include"Entity.h" class Attribute : public Entity { public: void save(FILE* fp); void print(); }; |
。
实体.cc:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #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(); } |
我想正确的问题是"C++中派生类的成员(不是对象)是否可以被父类访问?"
派生类可以访问基类的公共成员和受保护成员(数据成员和函数)。
类的公共成员可以从任何地方访问。当然,它们需要通过该类的一个实例来访问。
But in the case that the attributes and methods from the derived class are public theyaren't accessible by the parent/base class?
号
如果您有派生类的实例,则可以是。然后可以从基类访问派生类的公共成员。
编辑:
例如,基类成员访问派生类的公共成员,反之亦然。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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(); } |
这意味着如果你有
1 2 3 | class Foo class Bar : public Foo |
所以你可以说,正如预期的那样
1 2 | Foo* myFoo = new Foo; Bar* myBar = new Bar; |
号
你也可以用
1 | Foo* myOtherFoo = new Bar; |
不能从
1 | Bar* myOtherBar = new Foo; |
。