【发布时间】:2016-06-13 13:33:18
【问题描述】:
我有一个类结构如下:
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 的类的任何实例上调用method( ... ),这将使用成员变量作为默认参数调用派生类中定义的方法。
从我在 Stack Overflow here 其他地方读到的内容来看,覆盖必须具有相同的签名,这就是它无法编译的原因。
这种方法是否存在任何潜在的歧义?
我能想到的两种方法来解决这个问题:
- 为每个派生类声明一个默认的
method( 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.
【问题讨论】:
-
如果你把拼写错误和保留关键字的使用放在一边(默认在 C++ > 11 中), il 可以正常工作。只需添加一个虚拟覆盖以使其更清晰,您就可以开始了。
-
@Davidbrcz - 谢谢,更正了示例中保留字的误用
标签: c++ overloading overriding