2014-02-25 154 views
1

在Shape.hpp:C++爲什麼繼承不起作用?

class Shape { 
    public: 
    char c; 
    virtual void paint(); 
    ... 
}; 

在Triangle.hpp:

#include "Shape.hpp" 

class Triangle : public Shape { 
    ... 
}; 

在Triangle.cpp:

... 

void Triangle::paint() { 
    ... 
} 

... 

當編譯:

error: class ‘Triangle’ does not have any field named ‘c’ 
error: no ‘void Triangle::paint()’ member function declared in class ‘Triangle’ 

我做不明白爲什麼Tr iangle沒有其父類Shape的字段和成員函數。這怎麼解決?

+1

你從來沒有在'Triangle'中聲明任何'paint'函數。任何C++多態資源都應該有很好的工作示例。 – chris

+0

您的'類Triangle'定義在右大括號後缺少';'。 – pmr

+0

@pmr這只是一個錯誤,而不是在代碼中。現在已經修復了。 – user2460978

回答

6

您需要聲明paint()成員函數中Triangle太:需要

class Triangle : public Shape 
{ 
public: 
    void paint() override; 
}; 
+2

+1。 –

+0

確實,這解決了成員函數的問題。怎麼樣的領域? – user2460978

+1

@ user2460978您應該發佈一些代碼來重現'c'問題。 – juanchopanza

2

覆蓋函數的聲明在派生類中太:

class Triangle : public Shape 
{ 
public: 
    void paint(); 
}; 

可選,在C++ 11可以更明確:

class Triangle : public Shape 
{ 
public: 
    void paint() override; 
}; 

然後編譯器也知道這是一個覆蓋,所以可以「檢查」你沒有改變/添加你認爲是覆蓋的新功能。