c++ - 了解具有不同签名的继承和函数

标签 c++ inheritance polymorphism

假设我有一个基类和一个派生类。

class Base {
 public:
  void A(int x, int y) {do something}
  void B() {
    A(x,y);
    do something;
  }
};

class Derived : public Base {
  void A() {do something else};
};

Derived derived1;
derived1.B();

函数的签名不同,B会调用derived A还是base A?如果它将调用派生的 B,我猜它会忽略参数?

如果派生的 A 需要不同的参数而不是没有参数怎么办,我是否必须将 B 的整个代码复制到派生类中只是为了改变 B 调用 A 的方式?

最佳答案

函数的代码总是在定义它的类的上下文中求值。这包括确定每个表达式调用哪个函数。所以里面Base::B() , 电话 A(x, y)由编译器翻译为对 Base::A 的调用.即使您稍后调用 derived1.B() , 它会调用 derived1 . Base::A (伪语法)。

唯一稍微改变的是虚函数。但是,即使有它们,规则也是相似的。重载解析(基本上是将函数名称和签名与调用表达式匹配的过程)在定义包含函数的类的上下文中完成。如果解决方案导致选择虚函数,则将在运行时调用虚调用机制以调用该函数的适当覆盖

让我们考虑这个例子:

struct Base {
  virtual void foo(int);
  virtual void bar() { foo(0.0); }
};

struct Derived : Base {
  virtual void foo(int);
  virtual void foo(double);
};

Derived d;
d.bar();

即使在这个例子中,调用 d.bar()会调用Derived::foo(int) .那是因为调用签名匹配是在 Base 的上下文中完成的,它只能看到 foo(int)并使用 double 的隐式转换至 int.

关于c++ - 了解具有不同签名的继承和函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16014475/

相关文章:

c++ - 如何使用关键事件来翻译 OpenGL 中的对象?

javascript - 原型(prototype)继承应该节省内存吧?

C++ - 不需要使用基本方法

C++ 多态接口(interface)

c++ - 初始化一个复杂的对象。当我不这样做时出错?

c++ - 为什么 setsockopt( TCP_REPAIR ) 在进程具有 root 权限时返回 EPERM?

C++ 从 protected 抽象/派生类创建变量

c++ - 多态性是否适用于在 C 中传递的 C++ 对象引用?

java - 如何在运行时通过反射获取字段类型?

c++ - 无法转换函数指针参数