代码之家  ›  专栏  ›  技术社区  ›  Ricko M

C++继承问题

  •  1
  • Ricko M  · 技术社区  · 15 年前

    我有一节课,内容如下:

    Class A
    {
       virtual int doSomethingCool() = 0;
    };
    
    Class B : public A
    {
      int doSomethingCool();
    };
    

    现在的问题是,我有一组依赖于as接口的类。我需要更改其中一个派生类的函数原型。我需要给它传递一个参数。

    Class C: public A
    {
     int doSomethingCool(int param);
    };
    

    有什么建议可以让我做到这一点吗?

    6 回复  |  直到 15 年前
        1
  •  2
  •   Skizz    15 年前

    不,您不需要将其添加到基类中。

    class A
    {
    public:
      virtual int doSomethingCool() = 0 {}
    };
    
    class B : public A
    {
    public:
      int doSomethingCool() {return 0;}
    };
    
    class C: public A
    {
    private:
      int doSomethingCool(); // hide base class version!
    public:
      int doSomethingCool(int param) {return param;}
    };
    

    你还可以打电话 doSomethingCool() 如果通过基类指针完成:

    C c;
    //c.doSomethingCool (); // doesn't work, can't access private member
    c.doSomethingCool (42);
    A &a = c;
    a.doSomethingCool ();
    //a.doSomethingCool (42); // doesn't work, no member of A has that signature
    
        2
  •  1
  •   T33C    15 年前

    将其添加到接口并默认它调用现有方法。您不必执行默认值,但也不必使其纯粹,否则所有派生类都必须实现。最好是不加定义或者扔出去。取决于你想达到什么目标。

    class A 
    { 
    public:
       virtual int doSomethingCool() = 0; 
       virtual int doSomethingCool(int param) {doSomethingCool()}; 
    };
    
        3
  •  0
  •   In silico    15 年前

    使功能 doSomethingCool() 拿着 int 参数输入 A .

    class A
    {
    public:
        virtual void doSomethingCool(int param) = 0;
    };
    
        4
  •  0
  •   Chubsdad    15 年前

    没问题。你能做到的。唯一需要注意的是,它不会被视为基类虚函数的重写。

    class A 
    { 
    public:
       virtual void doSomethingCool() = 0; 
    };
    
    class B : public A 
    {
    public:
       void doSomethingCool(); 
    }; 
    
    class C: Public A 
    { 
    public:
       void doSomethingCool(int param); 
    }; 
    
    
    int main(){}
    

    因此,虽然技术上可行,但您可能真的希望重新关注接口类A的设计。

    一个选项可能是为a::doSomethingCool提供默认参数

    virtual void doSomethingCool(int = 0) = 0;
    
        5
  •  0
  •   Å imon Tóth    15 年前

    这不是语法正确的C++。

    不,你不能改变原型。怎么用?如果调用非参数版本,参数的值是多少?

        6
  •  0
  •   Daniel Lidström    15 年前

    我会介绍另一个更具体的接口:

    struct A
    {
      virtual int doSomethingCool() = 0;
    };
    
    struct A_specific : A
    {
      virtual int doSomethingCoolWithThis(int i) = 0;
    };
    
    class ConcreteA : public A
    {
      int doSomethingCool() { return 0; }
    };
    
    class ConcreteA_specific : public A_specific
    {
      int doSomethingCool() { return 0; }
      int doSomethingCoolWithThis(int param) { return param; }
    };
    

    然后我将编程到正确的界面:

    int main()
    {
       const A& a1 = ConcreteA();
       const A_specific& a2 = ConcreteA_specific();
    
       a1.doSomethingCool();
       a2.doSomethingCool();
       a2.doSomethingCoolWithThis(2);
    }
    

    只是给你另一个主意;-)

    祝你好运!

    推荐文章