2012-03-13 41 views
7

Tôi có một tập hợp các lớp như thế này:C++ tránh bằng tay gọi hàm lớp cơ sở

class A { 
public: 
    int DoIt() { 
    //common code 
    } 
}; 

class B : public A { 
    int DoIt() { 
    if (A::DoIt() == 1) { 
     return 1; 
    } 
    else { 
     // do b specific code 
    } 
    } 
}; 

class C : public A { 
    int DoIt() { 
    if(A::DoIt()==1) { 
     return 1; 
    } 
    else { 
     // do c specific code 
    } 
    } 
}; 

Có cách nào tôi có thể tránh bằng tay đặt mã này:

if (A::Doit() == 1) { return 1; } else { 

trong mỗi lớp đó là bắt nguồn từ A?

+1

Cú pháp chính xác là 'lớp B: công khai A'. C++ không phải là Java. – kennytm

+0

@Justin ᚅᚔᚈᚄᚒᚔ: OP đang hỏi cách tránh gõ 'if (A :: Doit() == 1) trả về 1; } else {'trong mọi phân lớp, không phải cách gọi 'A :: Doit()' mà không biết A. Câu hỏi liên kết thậm chí không liên quan đến thừa kế. – kennytm

Trả lời

9

Chỉ cần tách mã cụ thể cho phương thức ảo khác của phương thức.

class A 
{ 
public: 
    int DoIt() /*final*/ 
    { 
     // common code 
     if (return_value == 1) 
      return 1; 
     else 
      return DoIt_specific(); 
    } 

private: 
    virtual int DoIt_specific() = 0; 
    //^or some "A"-specific actions if A cannot be abstract. 
}; 

class B : public A 
{ 
    virtual int DoIt_specific() /*override*/ 
    { 
     // specific code for B 
    } 
}; 

Điều này được gọi là thành ngữ non-virtual interface.

Các vấn đề liên quan