OOP中的概念和语法错误。从母类重新定义的子类中的非虚方法是否被掩盖了?

时间:2015-05-20 23:22:28

标签: c++ class oop polymorphism virtual

举个例子,我们给出了示例代码,我们必须找到它的错误并解释为什么会出现错误。我的问题编号为1-5。

第一部分

我们有一个类Flight,声明如下:

class Flight {
public:
~Flight(){for(auto & b: places) delete b; }
....
..
private: 
vector<unique_ptr<Bill>>places; //bill is a previously declared class
}; 

我说是因为b是unique_ptr而我们无法删除它们,默认情况下它们会被删除。所以我的建议是我们可以更改属性并在C,vector<Bill*>places;中取正常点,或者只删除析构函数。但是,有人建议我们改为编写b.reset();

  1. 有人可以向我解释一下这个目的是什么,而不仅仅是删除析构函数?哪个更好,为什么?
  2. 第二部分

    还有其他概念上的错误,我不确定我是否正确。其余代码如下:

    class Sell {
    public: 
    virtual ~ Sell(){}
    virtual double price() const = 0; 
    protected: 
    double base_price; 
    }; 
    
    class Bill : public Sell {
    public: 
    Bill(int id, double price, string name, bool vegetarian) etc{}
    virtual ~Bill()
    
    {}
    virtual ostream& display(ostream& out) const 
    out << "no. " << id << " for " << name << endl; return out; 
    }
    
    double price() const{
    if(vegetarian) { return base_price() - 20; }
     else { return base_price(); }
    }
    
    private: int id; string name; bool vegetarian; 
    }; 
    
    ostream& operator << (ostream& out, const Bill& bill){ return bill.display(out); }
    
    class Business : public Bill {
    public: Business(int id, double base_price.........)etc
    virtual ~Business() { ~Bill(); }
    
    ostream& display(ostream& out ) const {
    out << "business "; 
    Bill::display(out); 
    if (extra_space){ out << "with supplementary space. " ; }
    return out; 
    }
    
    double price() {
    double p(Bill::price()); 
    if(extra_space) { p*= 1.5; }
    return p; 
    }
    
    private: bool extra_space; 
    }; 
    
    //then there is class Flight as defined above. 
    class Flight {
        public:
        ~Flight(){for(auto & b: places) delete b; }
        void sold(Bill* b){ places.push_back(unique_ptr<Bill>(b)); }
        void display() const {
    for(auto const& b: places){cout << "The Bill " << *b << "is " << b->price() << "Dollars. " << endl; 
    }}
    
        ..
        private: 
        vector<unique_ptr<Bill>>places; //bill is a previously declared class
        }; 
    
    int main(){
    Flight f1; 
    f1.sold(new Bill(1,100,"Chopin", true)); 
    f1.sold(new Business(2, 100, "Sand, false, true)): 
    f1.display() << endl; 
    return 0; 
    }
    
    1. 有一条警告说virtual double Bill::price() const被隐藏了。我建议这是屏蔽,并且账单类中的价格函数应该是虚拟的。这有意义吗?
    2. double Business::price() [Woverloaded-virtual]也发出警告。我不明白,这是因为const中定义的price()类中没有business
    3. 此外,price()被认为是所有类中的相同功能吗?因为我不明白如果商业价格中缺少const,它会编译。我原以为它不仅会显示警告而且会显示编译错误......
    4. 最后,对于main()函数,(new Business)存在问题,这是因为我们只能为帐单创建地址吗?

1 个答案:

答案 0 :(得分:0)

几乎所有类,如果它们是用c ++ 11或更高版本编写并且设计得当,则不会有用户定义的析构函数,用户定义的复制运算符或用户定义的移动运算符。

有一个很好的理由,即如果你没有定义任何这些,编译器将为你生成正确的版本。

在你的情况下,Bill的向量是通过std :: unique_ptr管理账单的生命周期(好!!)。这意味着生命周期将被自动正确管理,你的第一个直觉是正确的 - 只需删除析构函数,让编译器做正确的事。

你朋友建议用.reset()替换删除也是正确的,但是很复杂且不必要。