2014-11-25 19 views
0

我已經看到了C++以下兩種實現方式,對於類的定義和聲明,這已經讓我感到困惑可供選擇,看看這個:如何在C++中實現接口或類接口關係?混淆的.h文件和無效()= 0

Class A_Interface 
{ 
    public : 
    virtual void Show() = 0; 
} 

Class A : A_Interface // implements class 
{ 
    // implements methods 
} 

但是,不管這個,我們有清晰的分離是這樣的:

文件:

MyClass.h

class MyClass 
{ 
    void Show(){}; 
} 

而在MyClass.cpp:

MyClass::show(){ 
    /......../ 
} 

如何上面的兩個不同,是他們都有些「接口」的?

因爲我們需要一個接口來實現我們的類,而且看起來上述兩種方法都會爲我們做到這一點。

+2

也許你應該閱讀關於抽象基類和純虛函數。網上有很多關於此的網頁。另外閱讀一般的C++和頭文件等等。 C++不是一種語言,您可以隨時跳入並理解。 – dandan78 2014-11-25 07:46:24

+0

繼續使用'class MyClass:public A_Interface {...' – 2014-11-25 07:48:48

+0

@dandan如果我認爲它是一種簡單的語言,我不會問這個問題。我問它只是爲了瞭解它們與「接口」的區別。 – 2014-11-25 08:01:14

回答

1

你可能想要寫一個頭文件,定義接口類

// MyInterface.h -- Header file for MyInterface 

#pragma once 

class MyInterface 
{ 
public: 
    // Empty virtual destructor: good practice for proper cleanup 
    virtual ~MyInterface() {} 

    // Interface methods are pure virtual: 
    virtual void Show() = 0; 
    // ... some other methods in the interface... 
}; 

然後你就可以有一個類實現上述接口,用代碼分裂的頭文件之間.cpp執行文件:

// MyClass.h -- Header file for MyClass 

#pragma once 

#include "MyInterface.h" // Include interface's header file 

class MyClass : public MyInterface 
{ 
public: 
    // Methods implemented from MyInterface 
    void Show() override; 

    // NOTE: "override" is a new C++11 feature. 
    // If you are using an older C++98/03 compiler, you can't use it. 

    // Other class stuff... 
}; 

你可以執行o f MyClass在.cpp文件中:

// MyClass.cpp -- Implementation of MyClass 

#include "MyClass.h" // MyClass's header file 

// Implementation 

void MyClass::Show() 
{ 
    // ... code 
} 
2

這裏A_interface是抽象類(界面),因爲它具有的功能部件,其是純虛

virtual void Show() = 0; 

現在考慮MyClass的;所有聲明都在MyClass.h中,實現在MyClass.cpp中(這是一種優先方法)。

兩者有何不同? 其中一個是抽象類(不能擁有A_interface類型的對象,而是必須從中剝離類並重寫其純虛函數。) 其他類是簡單的類。

1

當您將其中一個類方法定義爲等於零時,您將該類作爲抽象基類,因此無法實例化(接口)。可以定義抽象基類中的一些方法。雖然你不能實例化一個抽象基類的對象,但你可以聲明它的指針。

Class AbstractClass 
{ 
    public : 
    virtual void Show() = 0; 
} 

Class DerivedClass: public AbstractClass 
{ 
    public : 
    virtual void Show() = 0; 
} 


AbstractClass a = DerivedClass() # FAILS TO COMPILE 

AbstractClass* a = new DerivedClass() # WORKS!