gpt4 book ai didi

c++ - 将派生类方法链接到基类方法

转载 作者:行者123 更新时间:2023-11-30 03:40:38 25 4
gpt4 key购买 nike

我正在编写一个带有可链接方法的库。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com