为什么纯虚拟机制不考虑继承函数?

在询问之前,我已经提到了这个较老的问题。但我仍然有疑问。
struct B1 {
  virtual void fun () = 0;
};
struct B2 {
  void fun () { cout<<"B2::fun()n"; }
  void fun (int i) {}
};
struct D : B1, B2 {
  using B2::fun;  // This line doesn't help
};

int main ()
{
  B1 *pB1 = new D;  // Error: cannot allocate 'D' because 'B1::fun()' is abstract
  pB1->fun();
}
有没有理由让C ++标准不接受,继承成员函数来解决
pure virtual
机制? 为什么
using
关键字无法帮助解决此错误? (编译器:linux-64 g ++) 哪个函数用于
using
关键字,
B2::fun()
B2::fun(int)
? (该行没有歧义)     
已邀请:
  哪个函数用于使用关键字,B2 :: fun()或B2 :: fun(int)? (没有    歧义   那条线)      来自ISO / IEC 14882:2003(E)7.3.3.12   当using声明将基类中的名称带入派生类范围时,派生类中的成员函数会覆盖和/或隐藏基类中具有相同名称和参数类型的成员函数(而不是冲突)。
[Example:
    struct B { 
        virtual void f(int);
        virtual void f(char); 
        void g(int); 
        void h(int);
    };

    struct D : B { 
        using B::f;
        void f(int);   // OK: D::f(int) overrides B::f(int);

        using B::g; 
        void g(char);  // OK

        using B::h; 
        void h(int);   // OK: D::h(int) hides B::h(int)
    };

    void k(D* p) {
        p->f(1);    //calls  D::f(int)
        p->f(’a’);  //calls  B::f(char)  // Notice the call being resolved
        p->g(1);    //calls  B::g(int)
        p->g(’a’);  //calls  D::g(char)
    }

— end example] 
  [注意:两个using声明可能会引入函数        相同的名称和相同的参数类型。如果,对于不合格的电话        函数名,函数重载决策选择引入的函数        通过这样的使用声明,函数调用是不正确的。 ] 因此,在您提供的示例中,根本没有歧义。根据传递的参数,可以决定对方法的调用。     
using B2::fun;
只允许你使用
B2::fun
方法,但由于
B1
是一个抽象类,你必须实现该类的纯虚函数乐趣才能创建它的对象。     
好。我得到了第一个答案,只是基于逻辑推理。假设,标准是接受继承的方法来解决
pure virtual
机制,那么正常的“虚拟”函数就会存在歧义。 即假设
B1::fun()
是正常的虚函数,那么
B1::fun()
B2::fun()
之间会有选择混淆。因此,最好避免考虑至少为
virtual
机制的继承成员。     
using
仅调整名称查找过程。它不会将函数导入给定范围,也不会定义新函数。 所以,你只需要定义一个新的
virtual
覆盖。     
我绝不是C ++专家程序员,但让我尝试一下: 我认为从编译器的角度来看,B1和B2是两个完全不同的类,它们碰巧在每个类中都有一个相同名称的方法。即使涉及D的范围,编译器也没有理由使用B2的fun()实现来实现B1的fun()。 (如果我们查看虚拟表机制,我可以得到一些清楚的东西。我们可能会看到为什么B2 :: fun()对B1的fun()没有帮助。) “使用”指令只是使符号“有趣”在D的范围内可见。 “using”不会将任何fun()实现附加到D类(但D需要B1 :: fun()的实现)。 嗯......这里的“使用”指令实际上并没有“使用”(或者我们说“调用”)两者中的任何一个。 “使用”只是将名称引入D的范围(AKA使名称在D范围内可见,类似于再次声明它们)。     

要回复问题请先登录注册