簡體   English   中英

純虛函數重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM