**①如果在main函数里,main既不是父类的友元函数也不是成员函数,所以不能用父类里的私有成员和受保护的成员。
②在main函数里,即使是子类,也不能用父类受保护的成员。
③受保护的成员可以继承类用,但是父类是不能在类外的地方用,即使没在main函数里。**
*公有继承表示在继承类外(如main函数里),除了公有成员可以用,其他是不能的。受保护的在继承类里用是可以的 也是受保护的对象。
私有继承表示把父类公有的和受保护的都变成私有成员。*
#include <iostream>
#include <string>
using namespace std;
class Item_base //父类
{
public :
//int x;
Item_base(const string &book = " ", double sales_price = 0.0) :isbn(book), price(sales_price){}
string book()const //访问私有的数据成员
{
return isbn;
}
virtual double net_price(size_t n) const //虚函数 被继承之后 派生类可以把虚函数重新定义 因为要批量购买, 比如单价是打折的
{
return n * price;
}
private:
string isbn;//书号
//int y;
protected:
double price;//价格 受保护的成员是用来作为继承的
};
class Bulk_item :public Item_base //子类
{
public:
Bulk_item(const string &book = " ", double sales_price = 0.0,
size_t qty = 0, double disc_rate = 0)
:Item_base(book, sales_price), min_qty(qty), discount(disc_rate){}
void test()
{
// cout << x << endl;
cout << price << endl;
}
void test2(const Bulk_item &d, const Item_base &b)
{
cout << d.price << endl;
cout << b.book() << endl;
//cout << b.price << endl; // 此处不能用父类的对象来使用price 因为受保护的可以在子类里用 但是不能在类外的地方老子用
}
double net_price(size_t cnt) const
{
if (cnt >= min_qty)
return cnt*(1 - discount)*price;
else
return cnt*price;
}
private:
size_t min_qty;
double discount;
};
int main()
{
Item_base item("0-12-3456-789", 9.9);
cout << item.book() << "," << item.net_price(10) << endl;
Bulk_item item2("0-12-3456-789", 9.9, 10, 0.12);
cout << item2.book() << "," << item2.net_price(10) << endl;
item2.test();
item2.test2(item2, item);
system("pause");
}
1214Cpp多态
#include <iostream>
#include <string>
using namespace std;
class Item_base //父类(基类)
{
public:
Item_base(const string &book = " ", double sales_price = 0.0) :isbn(book), price(sales_price){}
string book()const //访问私有的数据成员
{
return isbn;
}
virtual double net_price(size_t n) const //虚函数 被继承之后 派生类可以把虚函数重新定义 因为要批量购买, 比如单价是打折的
{
return n * price;
}
private:
string isbn;//书号
protected:
double price;//价格 受保护的成员是用来作为继承的
};
class Bulk_item :public Item_base //子类(派生类)
{
public:
Bulk_item(const string &book = " ", double sales_price = 0.0,
size_t qty = 0, double disc_rate = 0)
:Item_base(book, sales_price), min_qty(qty), discount(disc_rate){}
void test2(const Bulk_item &d, const Item_base &b)
{
cout << d.price << endl;
cout << b.book() << endl;
//cout << b.price << endl; // 此处不能用父类的对象来使用price 因为受保护的可以在子类里用 但是不能在类外的地方老子用
}
double net_price(size_t cnt) const
{
if (cnt >= min_qty)
return cnt*(1 - discount)*price;
else
return cnt*price;
}
private:
size_t min_qty;
double discount;
};
void print_total(ostream &os, Item_base *item, size_t n)
{
os << "ISBN" << item->book() << "\tnumber sold: " << n << "\ttotal price:" << item->net_price(n) << endl;
}
int main() //如何实现多态 派生类和基类相互转换
//必须用指针或者引用去调用虚函数形成多态
{
Item_base *a = new Item_base("1-234-567-01", 11.0);
Bulk_item *b = new Bulk_item("1-234-567-02", 22.0, 2, 0.05);
print_total(cout, a, 2);
print_total(cout, b, 3);
Item_base *books[5];
books[0] = new Item_base("0-123-456-01", 10.0);
books[1] = new Bulk_item("0-123-456-02", 20.0, 6, 0.05); //可以用动态分配的父类的变量new一个子类的对象
books[2] = new Item_base("0-123-456-03", 30.0);
books[3] = new Bulk_item("0-123-456-04", 40.0, 4, 0.15);
books[4] = new Bulk_item("0-123-456-05", 50.0, 2, 0.18);
int num[5];
num[0] = 2;
num[1] = 10;
num[2] = 1;
num[3] = 5;
num[4] = 3;
for (int i = 0; i < 5; i++)
{
print_total(cout, books[i], num[i]);
}
system("pause");
}