繁体   English   中英

运行时绑定和虚拟继承

[英]runtime binding and virtual inheritence

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?
}

在派生中:重载base ..的f() ,因此应隐藏所有基本f()版本。
现在,对于br.f()br.f(s) :由于运行时绑定,应调用f()f(s)的derived,但应将其隐藏,而代码仍将编译并执行int Base: :f()和无效Base :: f(string)。

Q1:我想念什么?
问题2: br.f(1)无法编译,因为在编译期间执行了类型检查,并且Base中不存在int f(int) 我对么?

基类从不知道派生类中新添加的成员,它仅具有有关声明自身的成员的信息。
因此,当将派生类实例d4分配给基类引用br ,新添加的方法int f(int) constbr隐藏。 这就是下面代码的编译错误的原因

// 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)函数对基类隐藏函数,但不覆盖它们。 为此,它应该具有完全相同的签名。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM