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);
}
#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;
}
#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函数,这个函数对于外部来说应该是共有的,可以访问的,但是在编译的时候编译器使用的任然是父类的函数,父类的函数此时没有访问权限,因此可以断定编译阶段多态性没有体现出来,编译的时候还是根据函数的参数类型来进行调用的。
浙公网安备 33010602011771号