运行时绑定和虚拟继承

runtime binding and virtual inheritence

本文关键字:继承 虚拟 绑定 运行时      更新时间:2023-10-16
class Base {
  public:
  virtual int f() const {
       cout << "Base::f()n";
       return 1;
}
 virtual void f(string) const {}
 virtual void g() const {}
};
class Derived4 : public Base {
  public:
       int f(int) const {
         cout << "Derived4::f()n";
         return 4;
    }
};
int main()
{
    string s("hello");
    Derived4 d4;
    Base& br = d4; // Upcast
    // br.f(1); // Derived version unavailable
    br.f(); // why does it compile and run?
    br.f(s);// why does it compile and run?
}

在派生中:重载 f() 的 base .. 所以所有的基本f()版本都应该被隐藏。
现在,对于 br.f(( 和 br.f(s(:由于运行时绑定,应该调用派生的f()f(s),但它们应该被隐藏,代码仍然编译并执行 int Base::f(( 和 void Base::f(string(。

Q1 : 我错过了什么?
问2 : br.f(1) 不会编译,因为在编译期间,将执行类型检查,而 Base 中不存在int f(int)。我说的对吗?

类永远不会知道派生类中新添加的成员,它只有关于声明自己的成员的信息。
所以当派生类实例d4被分配给基类引用br时,新添加的方法int f(int) const被隐藏到br。这就是为什么以下代码的编译错误

// br.f(1); // Derived version unavailable

其中以下两行编译成功

br.f();
br.f(s);

为了更多了解:

class Base {
  public:
  virtual int f() const {
       cout << "Base::f()n";
       return 1;
}
 virtual void f(string) const {}
 virtual void g() const {}
};
class Derived4 : public Base {
  public:
       int f(int) const {
         cout << "Derived4::f()n";
         return 4;
    }
    void g() const {
         cout<< "Derived4::g()" << endl;
    }
};
int main()
{
    string s("hello");
    Derived4 d4;
    Base& br = d4; // Upcast
    // br.f(1); // Derived version unavailable
    br.f(); // No Compilation error
    br.f(s);// No Compilation error
    d4.f();  // Compilation error
    d4.f(s); // Compilation error
    d4.f(1); // No Compilation error
    d4.g();  // No Compilation error
    br.g();  // Will print - "Derived4::g()"
}

希望对您有所帮助!

函数

int Derived4::f(int)隐藏基类中的函数,但不会覆盖它们。 为此,它应该具有完全相同的签名。

在函数重写的情况下,可以在基类引用上调用函数,并查看正在调用的派生类函数。