基类如何知道它的派生类的属性

时间:2017-11-29 17:51:18

标签: c++

嗨,我在逻辑上遇到这个问题,需要一些帮助。我设置的是一个名为'objects'的基类和一个名为'robot'的派生类。我在另一个类'游戏'中创建了一个'机器人'的实例,其中包括'机器人'(通过指针)。所以我的代码行是

robot* rob = new robot(int x, int y)

其中position是类机器人的属性。在我的'objects'类中,我有x和y坐标的Get和Set函数,因为x和y坐标被设置为private。

现在,我知道“机器人”类可以访问并更新它自己的x和y坐标。是否可以在'对象'类中包含甚至更改x和y?我这样想的方法是在'对象'中创建一个'游戏'成员,并在'对象'中改变'机器人'的位置。但是,当'rob'作为'对象'的引用传递时,它是否仍然会改变x和y坐标?即使在那之后,“游戏”如何知道“抢劫”的新位置?

编辑:由用户解决

1 个答案:

答案 0 :(得分:1)

基类是后面更专业的类的抽象。因此,基础知道什么都不知道,并且不需要知道那些从它衍生出来的东西。所有任何类都知道它本身以及它所基于的类可供它使用。

此外,C ++构建过程使得无法知道未来子类的所有可能排列。它必须知道可能尚未编写的代码或者在以后或运行时可能或可能不会链接的其他模块中。

通过子类操作基类的成员,大多数时候您不必执行任何操作。对于publicprotected变量,可以在子类中访问基类中的内容。与往常一样,private数据不受限制(但查询friend发货)。

如果基类具有int x

x = 24;

将在大多数情况下完成工作。

如果base和子类都有一个同名的变量,这只会成为一个问题。

某些代码的时间:

#include <iostream>
struct object // using struct because it defaults to public access. 
              // This makes for a simpler example
{
    int x;
    int y;
};

struct robot:public object
{
    int x; // variable hides the x in object
    int y;

    void print()
    {
        std::cout << "robot: " << x << ',' << object::x << '\n'; 
        // to access object's x we must ask for it explicitly
    }
};

struct betterrobot:public object
{
    void print()
    {
        std::cout << "better robot: " << x << ',' << object::x << '\n';
    }
};
int main() {

    robot rob;
    rob.x = 24; // set robot's x
    rob.object::x = 42; // set object's x
    rob.print();

    betterrobot rob2;
    rob2.x = 24;
    rob2.print();

    return 0;
}

输出:

  

机器人:24,42

     

更好的机器人:24,24

Objectrobot拥有自己的xy。可以通过object明确请求xrobot rob.object::x = 42;

x

在输出中,打印object::xrob.x = 24; 给出了不同的答案。如果你只是

object::x

一旦智能编译器看到robot::print方法,就会因为没有初始化x而尖叫。如果没有,请尽快调试!

这是你很少想做的事情,因为它会对大脑造成严重破坏。你有两个x,当你在处理polymprphic对象时(注意:在例子中没有多态对象来保持简单),很容易搞砸并设置错误的betterrobot。除非没有办法避免,否则不要这样做。

继承和使用基类的变量几乎总是更好,以避免混淆。这就是betterrobot的作用。 object只有x的{​​{1}}和y。没有混淆的可能性。

rob2.x = 24;

就是全部。在输出中,打印xobject::x给出了相同的答案。

您可以像移动任何其他betterrobot一样移动object。例如objectmove中的函数可用于在地图上移动betterrobot。不需要特别的魔法。