總之,我相信我的問題的答案是否定的。但是,我會對那些比我聰明的人抱有希望并順從他們。
我想從指向基類的指標呼叫派生類的類方法。多載并希望呼叫的繼承方法是純虛擬的。我可以讓它在某些情況下作業,但不是在一種特定情況下,純虛方法包含省略號占位符作為引數。
我想要的精華貼在下面,非常感謝任何修復和/或建議,謝謝。
#include <iostream>
class A
{
public:
virtual void setup()=0;
virtual void callFunction(std::string str, ...)=0;
};
class B: public A
{
public:
virtual void setup() {};
virtual void callFunction(std::string str, ...) { std::cout<<"\nB::callFunction("<<str<<")\n"; }; //compiles: not desired: a->callFunction("Hello World", 987); executes as B::callFunction
//virtual void callFunction(std::string str, ...)=0; compile error: error: cannot declare variable 'c' to be of abstract type 'C'
};
class C: public B
{
public:
void setup() { std::cout<<"\nC::setup\n"; };
void callFunction(std::string str, int i) { std::cout<<"\nC::callFunction("<<str<<") = "<<i<<"\n"; };
};
int main()
{
C c;
A* a = (A*) new C;
c.setup();
c.callFunction("Hello World", 123);
a->setup(); //WHY: does this pure virtual function still execute C::setup, this is desired for pure virtual method callFunction derived from class A
a->callFunction("Hello World", 987);
return 0;
}
uj5u.com熱心網友回復:
作為評論的結論:
您不能通過在派生類中多載虛函式來影響虛調度。
多載解決和虛擬調度是正交的,前者發生在后者之前。
所以你可以做的是宣告多個多載,它們是單獨虛擬分派的。
在您的問題中,這只需將int多載作為純虛擬添加到A:
class A
{
public:
virtual void setup()=0;
virtual void callFunction(std::string, ...)=0;
virtual void callFunction(std::string, int)=0;
};
為了確保虛函式實作與這些多載正確匹配,您應該將說明override符添加到派生類中的所有實作,例如:
void callFunction(std::string str, int i) override { std::cout<<"\nC::callFunction("<<str<<") = "<<i<<"\n"; };
如果您需要支持更多引數型別,只需添加另一個純虛擬多載A并在繼承層次結構中的某個位置實作它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405194.html
標籤:
上一篇:分配期間沒有指標衰減的功能
