[英]Overload of pure virtual function
我通常使用純虛函數來處理我的代碼所需的那些方法。 因此,我創建接口,然后其他用戶實現其派生類。 派生類只將這些虛函數作為公共函數,而一些其他方法應該作為私有實現,因為我的代碼不會調用它們。 我不知道這是否可以被認為是OOP的一個好習慣(有沒有設計模式?)。 無論如何,我的問題是:用戶可以重載純虛函數嗎?
即
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
};
class Derived:
public Base
{
private:
// methods
public:
Derived();
virtual ~Derived();
virtual void foo(int, double, double); //this doesn't work
};
解決方案可能是:
virtual void foo(int,double,double=0)=0;
在基類但它是非常有限的。 你有什么想法?
這兩個功能是不同的。 后者並不壓倒第一個
virtual void foo(int,double)=0;
virtual void foo(int, double, double);
第二個是特定於派生的新虛函數。
如果你在最后放置一個override
,編譯會抱怨你沒有覆蓋任何東西。 這是c ++ 11檢查。
virtual void foo(int, double, double) override;
用戶可以覆蓋純虛函數以確認函數末尾的使用override
以進行驗證。 在您的情況下,只能使用派生指針或類型訪問第二個函數。 (雖然除非正確地重寫和實現純虛函數,否則無法實例化,直到它是一個抽象類)。 因此,如果不打算通過Derived
的類進一步覆蓋它,那么使它成為虛擬是一種開銷,因為它無論如何都不會覆蓋基本方法。
你不能。
假設您有一個Base
指針,指向Derived
對象。 使用Base
指針,您只能“訪問” Base
的接口(除非您轉換為Derived
指針,但這不是您需要的)。
重載函數只是一個與另一個函數具有相同名稱的函數,但接受一組不同的參數,即它是一個不同的函數。 它與一個或多個重載函數是否為虛擬無關。
在您提供的示例中,我相信用戶可以重載純虛函數,但只能覆蓋它。 並且您無法直接從基類訪問該函數 - 您需要將基類指針強制轉換為派生類指針。
正如其他人所指出的那樣,它是行不通的。
更離散的是,這是發生的事情
Derived d;
d.foo(5, 10.0); // Works as expected
Base &b = d; // b is polymorphic
b.foo(3,10,4); // foo(int, double, double) is not in class Base, hence compile-time resolution fails!
由於功能簽名不同,因此不會覆蓋。 根據多態性規則覆蓋函數,函數簽名和類型應該相同。
在這種情況下,這些功能是不同的。 virtual void foo(int,double)= 0; virtual void foo(int,double,double);
是不是在基類中重載foo最簡單的解決方案?
class Base
{
public:
Base();
virtual ~Base();
virtual void foo(int,double)=0;
virtual void foo(int,double,double)=0;
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.