Effective C + + Item 9 는 구조 와 분석 과정 에서 virtual 함 수 를 호출 하지 않 습 니 다.

본 고 는 senlie 오리지널 입 니 다. 이 주 소 를 유지 하 십시오.http://blog.csdn.net/zhengsenlie
경험 치: 구조 와 분석 기간 에 virtual 함 수 를 호출 하지 마 십시오. 이러한 호출 은 derived class 로 떨 어 지지 않 기 때 문 입 니 다.
예시:
[cpp]  view plain copy
#include   
#include   
using namespace std;  
  
class Transaction{                           //모든 거래 의 base class  
public:  
    Transaction(){logTransaction();}// 마지막 동작 은 이 거래 를 기록 하 는 것 이다.  
    virtual void logTransaction() const = 0; //형식 에 따라 다른 로그 기록 을 만 듭 니 다.  
};  
  
  
class BuyTransaction: public Transaction{    // derived class  
public:  
    virtual void logTransaction() const  
    {  
        cout << "BuyTransaction" << endl;    // 이 유형의 거래 기록  
    }             
};  
  
class SellTransaction: public Transaction{   // derived class  
public:  
    virtual void logTransaction() const  
    {  
        cout << "SellTransaction" << endl;   // 이 유형의 거래 기록  
    }     
};  
  
  
int main(){  
    BuyTransaction b;    
    system("pause");  
}  
출력:
(링크 오류) 
해석:
BuyTransaction 을 출력 하지 않 습 니 다. derived class 대상 이 base class 구조 기간 에 대상 의 유형 은 base class 이기 때문에 Transaction 의 logTransaction 을 호출 합 니 다.
Transaction 의 logTransaction 이 실현 되 지 않 았 기 때문에 링크 오류 가 발생 할 수 있 습 니 다.
요약 하면 derived class 대상 은 base class 구조 기간 (이때 대상 은 derived class 부분 이 없 음) 이 고 대상 의 유형 은 base class 입 니 다.
          derived class 대상 은 base class 분석 기간 (이때 대상 의 derived class 부분 이 분석 되 었 습 니 다) 대상 의 유형 은 base class 입 니 다.
수정: derived class 가 필요 한 구조 정 보 를 base class 구조 함수 에 위로 전달 하도록 합 니 다.
[cpp]  view plain copy
#include   
#include   
using namespace std;  
  
class Transaction{                           //모든 거래 의 base class  
public:  
    explicit Transaction(const std::string &logInfo);    
    void logTransaction(const std::string &logInfo) const; //지금 은 non - virtual 함수 입 니 다.  
};  
  
Transaction::Transaction(const std::string &logInfo){   // base class 구조 함수 의 실현  
    //...   
    logTransaction(logInfo);                         // 마지막 동작 은 이 거래 를 기록 하 는 것 이다.  
}  
  
void Transaction::logTransaction(const std::string &logInfo) const{  
    cout << logInfo << endl;  
}  
  
class BuyTransaction: public Transaction{    // derived class  
public:  
    BuyTransaction():Transaction("BuyTransaction"){}  
};  
  
class SellTransaction: public Transaction{   // derived class  
public:  
    SellTransaction():Transaction("SellTransaction"){}  
};  
  
  
int main(){  
    BuyTransaction b;     
    system("pause");  
}  
출력:
BuyTransaction

좋은 웹페이지 즐겨찾기