2011-12-14 15 views
13

Gần đây tôi đã câm như một nhà phát triển, vì vậy tôi đã lao xuống, có một cuốn sách C++ và học cách làm việc đúng cách. Trong đầu tôi, tôi biết tôi muốn làm gì. Tôi có hiệu quả muốn một Interface rằng khi được thừa hưởng, phải được ghi đè (nếu điều này là có thể?). Cho đến nay, tôi có như sau:C++ constructor class/destructors cơ sở trừu tượng - tính chính xác chung

class ICommand{ 

public: 
    // Virtual constructor. Needs to take a name as parameter 
    //virtual ICommand(char*) =0; 
    // Virtual destructor, prevents memory leaks by forcing clean up on derived classes? 
    //virtual ~ICommand() =0; 
    virtual void CallMe() =0; 
    virtual void CallMe2() =0; 
}; 

class MyCommand : public ICommand 
{ 
public: 
    // Is this correct? 
    MyCommand(char* Name) { /* do stuff */ } 
    virtual void CallMe() {} 
    virtual void CallMe2() {} 
}; 

Tôi đã cố để lại làm thế nào tôi nghĩ rằng các nhà xây dựng/destructor cần được thực hiện trong ICommand. Tôi biết nếu tôi xóa các nhận xét, nó sẽ không biên dịch. Hãy thể ai đó:

  1. Chỉ cho tôi làm thế nào để khai báo constructor/destructor trong ICommand và làm thế nào họ có nghĩa là để được sử dụng trong MyCommand
  2. Có tôi đặt mọi thứ lên một cách chính xác trong ICommand để MyCommand phải ghi đè lên CallMeCallMe2 .

Tôi hy vọng tôi đã không bỏ lỡ một cái gì đó thực sự đơn giản ...

+1

Về cơ bản bạn nên sử dụng 'std :: string' và destructor sẽ là' {} '. Ngoài ra hãy tìm hiểu về danh sách khởi tạo của hàm tạo và xem xét liệu bạn có nên dùng 'const char *' hay không. – UncleBens

Trả lời

20

C++ không cho phép nhà xây dựng ảo. Một thực hiện đơn giản (không có constructor ảo) sẽ giống như thế này:

class ICommand { 
public: 
    virtual ~ICommand() = 0; 
    virtual void callMe() = 0; 
    virtual void callMe2() = 0; 
}; 

ICommand::~ICommand() { } // all destructors must exist 

Lưu ý rằng ngay cả một destructor ảo tinh khiết must được xác định.

Một thực hiện cụ thể sẽ trông giống hệt như ví dụ của bạn:

class MyCommand : public ICommand { 
public: 
    virtual void callMe() { } 
    virtual void callMe2() { } 
}; 

Bạn có một vài options cho các nhà xây dựng. Một lựa chọn là để vô hiệu hóa các nhà xây dựng mặc định cho ICommand, do đó các lớp con sẽ để thực hiện một constructor mà các cuộc gọi constructor ICommand của bạn:

#include <string> 

class ICommand { 
private: 
    const std::string name; 
    ICommand(); 
public: 
    ICommand(const std::string& name) : name(name) { } 
    virtual ~ICommand() = 0; 
    virtual void callMe() = 0; 
    virtual void callMe2() = 0; 
}; 

ICommand::~ICommand() { } // all destructors must exist 

Một thực hiện cụ thể sẽ bây giờ nhìn một cái gì đó như thế này:

class MyCommand : public ICommand { 
public: 
    MyCommand(const std::string& name) : ICommand(name) { } 
    virtual void callMe() { } 
    virtual void callMe2() { } 
}; 
+1

"C++ không cho phép các nhà xây dựng ảo" Tôi không chắc đó là từ ngữ đúng. Điều gì sẽ là một nhà xây dựng ảo thậm chí có nghĩa là, nếu một số ngôn ngữ đã được thực hiện nó? (Lưu ý rằng tôi đang nói về các hàm tạo thực tế, chứ không phải hàm xây dựng giống như hàm và chỉ tham chiếu đến các ngôn ngữ tĩnh.) –

+0

@PaulManta Delphi có các hàm tạo ảo, hoạt động giống một nhà máy hơn nhưng kiểu đối tượng được xây dựng được quyết định trong chạy-thời gian (IIRC) –

+0

Tôi đang sử dụng định nghĩa của OP về hàm tạo ảo, đó là nhiều hơn một hàm * bắt buộc *, tương tự như các hàm thành viên ảo thuần túy thông thường. Trong trường hợp này, cái gì đó buộc các lớp con sử dụng một hàm tạo bao gồm tham số "name". Tôi đồng ý rằng một "nhà xây dựng ảo" về mặt kỹ thuật không có ý nghĩa. –