2012-03-18 13 views

cevap

65

C++ arayüzleri hiçbir yerleşik kavramları vardır. Sadece pure virtual functions'u içeren abstract classes'u kullanarak uygulayabilirsiniz. Birden fazla mirasa izin verdiğinden, bu sınıfı daha sonra bu arabirimi (yani, nesne arayüzü :-)) içerecek başka bir sınıf oluşturmak için devralabilirsiniz.

Örnek bir örnek şöyle bir şey olurdu -

class Interface 
{ 
public: 
    Interface(){} 
    virtual ~Interface(){} 
    virtual void method1()=0; // "=0" part makes this method pure virtual, and 
           // also makes this class abstract. 
    virtual void method2()=0; 
}; 

class Concrete : public Interface 
{ 
private: 
    int myMember; 

public: 
    Concrete(){} 
    ~Concrete(){} 
    void method1(); 
    void method2(); 
}; 

// Provide implementation for the first method 
void Concrete::method1() 
{ 
    // Your implementation 
} 

// Provide implementation for the second method 
void Concrete::method2() 
{ 
    // Your implementation 
} 

int main(void) 
{ 
    Interface *f = new Concrete(); 

    f->method1(); 
    f->method2(); 

    delete f; 

    return 0; 
} 
+6

Arabirim, sanal bir yıkıcıya sahip olmadığı için _undefined behavior_adı var. –

+0

@CharlesBailey: Üzgünüm, bundan bahsetmeyi unuttum. Onu yakaladığın için teşekkürler! Şimdi iyi mi? –

+2

... Beton :: method1 ve Beton :: Method2 tanımlamak çünkü aynı zamanda örnek derleme olmamalı ama yine de soyut olmasına rağmen bu Beton ve you.instantiate Betonun geçerli üye olmamakla birlikte. –

12

C++ arayüzünün hiçbir kavram yoktur,
Bir Abstract class kullanarak davranışını taklit edebilirsiniz.
Özet sınıf En az bir saf sanal işlevi vardır bir sınıf, Tek soyut bir sınıfın herhangi örneklerini oluşturamazsınız ama sen işaret eden ve referanslar oluşturabilir olduğunu. Ayrıca, soyut sınıftan miras alan her sınıf, örneklerin yaratılabilmesi için saf sanal işlevleri yerine getirmelidir.

7

Arayüz C++ saf soyut sınıfın başka bir şey değildir. İdeal olarak, bu arabirimiclass, yalnızca saf virtual genel yöntemleri ve static const verilerini içermelidir. Örneğin.

class interfaceA 
{ 
public: 
    static const int X = 10; 
    virtual void foo() = 0 
    virtual int get() const = 0; 
    virtual inline ~interfaceA() = 0; 
}; 
interfaceA::~interfaceA() {} 
+1

Ne sanal bir yıkıcının hakkında cevapsız yüzden .... benim bellekten yazdım? –

+0

Gelecekte olası bellek sızıntılarını önlemek için sanal bir dtor ekleyelim. – barankin

+0

@CharlesBailey, bunu kaçırdı. Gönderiyi düzenledim. Sadece sınıfın “soyut” özelliğini ve “satır içi” yi korumak için salt 'sanal' olarak eklenir, böylece başlık dosyasında bağlayıcı hataları olmadan bulunabilir. – iammilind