- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个带有可链接方法的库。
class Base {
protected:
int stepper=0;
public:
Base& baseMethod( void ) {
Serial.println( stepper );
return *this;
}
virtual Base& derivedMethod( void ) =0;
virtual Base& anotherDerivedMethod( void ) =0;
};
class Derived1 : public Base {
public:
Derived1& derivedMethod( void ) {
stepper += 1;
return *this;
}
Derived1& anotherDerivedMethod( void ) {
stepper -= 1;
return *this;
}
};
class Derived2 : public Base {
public:
Derived2& derivedMethod( void ) {
stepper += 2;
return *this;
}
Derived2& anotherDerivedMethod( void ) {
stepper -= 2;
return *this;
}
Derived2& specialMethod( void ) {
stepper *= 2;
return *this;
}
};
如您所见,baseMethod()
返回对 Base
类的引用,因此我不希望能够链接 derivedMethod( )
或 anotherDerivedMethod()
给它,因为 Base
类不应该访问任何派生方法。
但是,在我的测试代码中(为 Arduino 编写):
Derived1 myDerived1;
Derived2 myDerived2;
void setup() {
Serial.begin( 9600 );
// as expected, these work:
myDerived1.derivedMethod().baseMethod(); // prints 1
myDerived1.derivedMethod().derivedMethod().baseMethod(); // prints 3
myDerived1.anotherDerivedMethod().baseMethod(); // prints 2
myDerived1.anotherDerivedMethod().derivedMethod().baseMethod(); // prints 2
myDerived2.specialMethod().baseMethod(); // prints 0
myDerived2.specialMethod().derivedMethod().baseMethod(); // prints 2
myDerived2.derivedMethod().specialMethod().baseMethod(); // prints 8
// I wouldn't expect these to work, but I'm glad they do!
myDerived1.baseMethod().derivedMethod(); // prints 2
myDerived1.baseMethod().anotherDerivedMethod(); // prints 3
myDerived2.baseMethod().derivedMethod(); // prints 8
myDerived2.specialMethod().baseMethod().derivedMethod(); // prints 20
// and as expected, these don't work:
myDerived2.baseMethod().specialMethod(); // prints 22
myDerived2.baseMethod().derivedMethod().specialMethod(); // prints 24
}
void loop() { }
我可以将derivedMethod()
和anotherDerivedMethod()
链接到baseMethod()
,但我不能将 specialMethod()
链接到它。
method_chaining.ino:76:27: error: 'class Base' has no member named 'specialMethod'
我能看到的唯一区别是specialMethod()
没有在Base
类定义中提及。这就是它不起作用的原因吗?
如何将派生类方法链接到基类方法?
最佳答案
虚函数的全部意义在于能够从基引用或指针访问派生功能——这就是多态性的工作原理。 Base
引用有一个底层派生作为它的动态类型。事实上,因为您的 Base
是抽象的(即具有纯虚拟方法),它的动态类型不能是它自己(除了一些有限的边缘情况,例如在销毁期间),因为您通常不能创建一个对象抽象类型。
出于同样的原因,调用纯虚方法有解析(除了一些有限的情况)对派生类的调用。
上述情况的一个异常(exception)是当您尝试从析构函数调用纯虚方法时,这可能会导致运行时崩溃(“调用纯虚方法”)。
关于c++ - 将派生类方法链接到基类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37858610/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!