C++学习随笔1

C++继承与动态问题
C++中派生类继承基类的时候可以指定继承的类别如public,private,protected。各个继承的含义不多说了。
今天遇到一件有意思的事:
源代码:Item_base.h:
#include <string>
#include <iostream>
using namespace std;
class Item_base
{
public:
    Item_base(const std::string &book="",double sales_price=0.0):isbn(book),price(sales_price){}
    std::string book() const {return isbn;}

    virtual double net_price(std::size_t n) const
    {
        cout<<"Item_base funcs"<<endl;
        return n*price;
    }
    virtual ~Item_base(){}
private:
    std::string isbn;
protected:
    double price;
};

class Bulk_item: public Item_base
{
public:
    double net_price(std::size_t n) const;
private:
    std::size_t min_qty;
    double discount;
};
double Bulk_item::net_price(std::size_t n) const
{
    cout<<"Bulk_item funcs"<<endl;
    if(n >=min_qty)
        return n*(1-discount)*price;
    else
        return n*price;
}


double print_total(Item_base & item,size_t cnt)
{
    return item.net_price(cnt);
}
 
main函数:
 
#include <iostream>
#include "Item_base.h"
using namespace std;

int main()
{
    Item_base item;
    cout<<print_total(item,10)<<endl;
    Item_base *p=&item;
    Bulk_item bulk;
    cout<<print_total(bulk,10)<<endl;
    p=&bulk;
    return 0;
}
当Bulk_item public继承Item_base的时候没有任何问题,main函数中的多态性也体现的比较好。
但是单Bulk_item private继承Item_base的时候,问题来了:因为是private继承,因此父类中所有的成员都变成了private型的。当编译时会出错,错误原因是Bulk无法访问父类,但是在print_total中我们调用的应该是Bulk的print_total函数,这个函数对于外部来说应该是共有的,可以访问的,但是在编译的时候编译器使用的任然是父类的函数,父类的函数此时没有访问权限,因此可以断定编译阶段多态性没有体现出来,编译的时候还是根据函数的参数类型来进行调用的。
 

posted on 2013-04-15 08:53  crayzero  阅读(267)  评论(2)    收藏  举报

导航