【问题标题】:Dynamic binding and static动态绑定和静态
【发布时间】:2018-02-18 13:59:59
【问题描述】:

我想我在理解动态绑定方面遇到了一些麻烦。

假设我们有 2 个类:

class a1{ //..
virtual void print() const;
};

class a2:a1{ //...
void print() const override;
};

为什么以下是正确的:

a2 item_son;
a1 &item_father = item_son;
item_father->print();

被调用的印刷品是儿子的印刷品。

【问题讨论】:

  • 稍微修改一下代码使其可以编译后,cannot reproduce
  • ^ - 引用不是指针
  • 你的意思是实际上调用的是a1::print,而不是a2::print?现在是真的学习如何创建Minimal, Complete, and Verifiable Example的时候了。
  • 我还没有得到静态/动态绑定的连接
  • 你应该阅读public成员和public继承

标签: c++ dynamic-binding


【解决方案1】:

实际上,OP 确实意识到了virtual 重载与非virtual 函数重载的含义。但是,我的示例正在运行,因此,我想发布它:

#include <iostream>

class A1 {
  public:
  virtual void print() const
  {
    std::cout << "A1::print() called." << std::endl;
  }
};

class A2: public A1 {
  public:
  void print() const override
  {
    std::cout << "A2::print() called." << std::endl;
  }
};

class B1 {
  public:
  void print() const
  {
    std::cout << "B1::print() called." << std::endl;
  }
};

class B2: public B1 {
  public:
  void print() const
  {
    std::cout << "B2::print() called." << std::endl;
  }
};

using namespace std;

int main(void)
{
  A2 a2;
  cout << "Calling a2.print(): ";
  a2.print();
  A1 &a1 = a2;
  cout << "Calling a1.print(): ";
  a1.print();
  B2 b2;
  cout << "Calling b2.print(): ";
  b2.print();
  B1 &b1 = b2;
  cout << "Calling b1.print(): ";
  b1.print();
  return 0;
}

输出:

Calling a2.print(): A2::print() called.
Calling a1.print(): A2::print() called.
Calling b2.print(): B2::print() called.
Calling b1.print(): B1::print() called.

Life demo on ideone

【讨论】:

    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多