【问题标题】:Difference between upper class and inherited class pointing while assigning same class分配同一类时上层类和继承类指向之间的区别
【发布时间】:2014-01-02 08:47:19
【问题描述】:

当我个人学习 C++ 时,我怀疑将指针分配给类。例如:

 43 int main () {
 44     View *window = new View ("window");
 45     Render *renderer; // why Render(upper class) points subclass and it works?
 46     renderer = new Print;
 47     renderer->draw (window); // this renderer works like Print function. why?
 48 
 49     //what are the difference between up and down?
 50     Print *a;
 51     a = new Print;
 52     a->draw (window);
 53     return 0;
 54 }

供您参考,Render 是类,PrintRender 的子类。但是,正如您在第 46 行中看到的,Upper class 指向子类并且它可以正常工作。

所以,我也尝试在第 52 行指向 Print 类并调用 draw 函数。它可以正常工作。

我不知道它们有什么区别以及为什么它可以在没有错误或警告的情况下工作。

【问题讨论】:

  • 之所以有效,是因为这就是语言的设计方式。这应该包含在任何介绍性 C++ 书籍中。请注意,您有内存泄漏:每个new 都需要一个delete
  • 这是多态性。

标签: c++ class variable-assignment


【解决方案1】:

如果你实例化一个继承类,它的基础对象也会被实例化。这就是多态性。我认为你应该通读Virtual Functions C++ FAQ

【讨论】:

  • 那么有没有出现分配警告?例如,它看起来像 int *a; 分配 a = float b;
  • 这不一样,因为Print是从Render继承的,因此它们是相关的intfloat 不相关。此外,在我看来,您并没有真正理解指针。
  • 我无法理解相关的概念。最后一个问题,我明白这是一个非常愚蠢的问题,因为它的地址大小。
  • 建议拿一本好的 C++初学者书籍,仔细阅读继承章节。
  • 感谢您的帮助。 :)
【解决方案2】:

您可以将父类引用到子类的对象。使用此引用,您只能调用父类知道的那些函数,即只能调用父类中存在的那些方法。

通过使用父类的引用,该引用也可以引用任何其他子类对象。

【讨论】:

  • 您的评论引用也可以引用任何其他子类对象表示变量renderer可以指向任何其他子类?
  • 感谢您的帮助。对我帮助很大!
【解决方案3】:

之所以有效,是因为PrintRender 的子类,并且Liskov Substitution Principle 成立。

renderer->draw(window) 有效地调用了Print::draw,因为Render::draw 是一个虚函数。如果它没有被声明为virtualRender::draw 就会被调用。

不同之处在于,即使renderer 指向Print,您也不能将renderer 存储在std::vector<Print*> 中。另一个区别是Print 可以隐藏Render 的方法。 a 中的隐藏方法不像 renderer 中那样容易访问。

【讨论】:

    【解决方案4】:

    您正在声明一个指向Render 的指针,并为其分配在堆上创建的Print 对象的地址。因为Print 派生自Render,所以这是一个合法的赋值。

    编译器仅将renderer 视为Render 对象,因此查找Render 对象以查找draw() 方法。

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 2021-09-07
      • 2011-09-24
      • 2014-04-29
      • 1970-01-01
      • 2023-04-09
      • 2014-04-19
      • 1970-01-01
      相关资源
      最近更新 更多