c – 基类中的重载方法,默认使用成员变量

我有一个Class结构如下:

class Base {
    public:
        void setDefault( uint8_t my_default ) { m_default = my_default; }

        void method( uint8_t * subject ) { method( subject, m_default ); }
        virtual void method( uint8_t * subject, uint8_t parameter ) =0;

    protected:
        uint8_t m_default;
};

class Derived1 : public Base {
    public:
        void method ( uint8_t * subject, uint8_t parameter ) { /* do something to subject */ }
};

class Derived2 : public Base {
    public:  
        void method ( uint8_t * subject, uint8_t parameter ) { /* do something different to subject */ }
};

我希望能够在从Base派生的类的任何实例上调用方法(…),它将使用成员变量作为默认参数来调用派生类中定义的方法.

从我在Stack Overflow here上的其他地方读到的内容,覆盖必须具有相同的签名,这就是它无法编译的原因.

这种方法有任何潜在的含糊之处吗?

我可以通过两种方式来解决这个问题:

>为每个派生类声明一个默认方法(void),但这似乎不是很干
>为默认方法使用不同的名称(例如defaultMethod(uint8_t * subject))但我觉得这会让我的课程变得不那么直观

这有更好的方法吗?

这是一个完整的例子,它不会编译(Arduino IDE 1.7.9):

class Base {
    public:
        void setDefault( uint8_t my_default ) { m_default = my_default; }

        void method( uint8_t * subject ) { method( subject, m_default ); }
        virtual void method( uint8_t * subject, uint8_t parameter ) =0;

    protected:
        uint8_t m_default;
};

class Derived1 : public Base {
    public:
      void method ( uint8_t * subject, uint8_t parameter ) { *subject += parameter; }
};

class Derived2 : public Base {
    public:  
      void method ( uint8_t * subject, uint8_t parameter ) { *subject *= parameter; }
};

Derived1 derived1;
Derived2 derived2;

uint8_t subject = 0;

void setup() {
  // put your setup code here, to run once:
  derived1.setDefault( 3 );
  derived2.setDefault( 5 );
}

void loop() {
  // put your main code here, to run repeatedly:
  derived1.method( &subject, 1 );  // subject == 1  
  derived2.method( &subject, 2 );  // subject == 2  

  // won't compile with this line:
  derived1.method( &subject );  // subject == 5
}

产生的错误是:

over-ride-load.ino: In function 'void loop()':
over-ride-load.ino:39:29: error: no matching function for call to 'Derived1::method(uint8_t*)'
over-ride-load.ino:39:29: note: candidate is:
over-ride-load.ino:14:12: note: virtual void Derived1::method(uint8_t*, uint8_t)
over-ride-load.ino:14:12: note:   candidate expects 2 arguments, 1 provided
Error compiling.
最佳答案
我相信你正在寻找的是using指令.

你已经在Base完成了一切.虽然使用默认参数(通常)比定义第二个函数更好,但是根据您的要求(使用成员),这里不可能:所以你定义了第二个重载函数来修复它(并定义它内联 – kudos!).

但问题来自派生类.如果你没有覆盖虚函数,一切都会没问题:你可以使用这两种版本的方法.但你必须覆盖它,所以你有效地“掩盖”方法的基本版本(主题);用方法(主题,参数);

你想要做的是将所有Base的方法“提升”到各种Deriveds中,赋予它们相同的权重.怎么样?使用using指令.

在每个派生定义中,输入以下代码:

using Base::method;

这将Base的所有方法“推广”到Derived中 – 同时仍允许您覆盖单个方法.我建议你将该行直接放在每个Derived的method()覆盖之上.

转载注明原文:c – 基类中的重载方法,默认使用成员变量 - 代码日志