2012-07-10 59 views
10

下面的代碼段產生一個錯誤:C++抽象類參數誤差的解決方法

#include <iostream> 

using namespace std; 

class A 
{ 

public: 

    virtual void print() = 0; 
}; 

void test(A x) // ERROR: Abstract class cannot be a parameter type 
{ 
    cout << "Hello" << endl; 
} 

是否有解決方案/工作此錯誤其他/比

virtual void print() = { } 
替換

virtual void print() = 0; 

更好

編輯:我希望能夠通過任何類擴展/實現基類A作爲參數通過使用聚態度(即A* x = new B() ; test(x);

乾杯

+0

根據定義,Abstarct類不應該單獨實例化。它的方法需要被派生類重寫。只是好奇,你想通過這樣做達到什麼目的? – Mahesh 2012-07-10 21:17:11

+1

我想做類似於A x = new B()的類,並通過擴展/實現A的任何類。我應該更好地指定這個問題。 – Cemre 2012-07-10 21:18:48

+1

在嘗試提出解決方案/解決方法之前,我們需要了解問題。將抽象類作爲「按價值」參數傳遞的想法是毫無意義的。你想做什麼? – AnT 2012-07-10 21:19:04

回答

20

由於您無法實例化抽象類,因此按值傳遞一個幾乎肯定是一個錯誤;你需要通過指針或引用傳遞它:

void test(A& x) ... 

void test(A* x) ... 

按值傳遞會導致object slicing,與幾乎保證有意想不到的(壞的方式)的後果,所以編譯器將其標記爲錯誤。

+1

我會說這肯定是有保證的。 – 2012-07-10 21:20:17

+0

@LuchianGrigore你說得對,即使沒有額外的數據成員切片,切片也會一直髮生,因爲vtable將被「切掉」到基類的切片中。 – dasblinkenlight 2012-07-10 21:26:48

3

當然,更改簽名:

void test(A& x) 
//or 
void test(const A& x) 
//or 
void test(A* x) 

的原因,你的版本不工作是因爲A類型的對象並不在邏輯意義。這是抽象的。傳遞引用或指針會繞過此位置,因爲實際的類型作爲參數傳遞的不是A,而是實現的類A(派生的具體類)。