转换和继承,虚函数
Understanding conversions between base and derived classes is essential to
understanding how object-oriented programming works in C++.
理解基类和派生类之间的转换是必不可少的 理解面向对象编程在。
Like built-in pointers, the smart pointer classes (§12.1, p. 450) support the
derived-to-base conversion—we can store a pointer to a derived object in a
smart pointer to the base type.
像内置指针,智能指针类支持 导出到基类的转换可以存储一个指向派生类对象的一个
基类类型的指针。
class Quote
{
public:
Quote()=default;
Quote(const string &book, double sales_price):bookNo(book), price(sales_price)
{cout<<"Quote gouzhao function"<<endl;}
string isbn() const {return bookNo;}
//返回指定数量的项目总销售价格
//派生类将重写应用不同的折扣算法
virtual double net_price(size_t n) const {return n*price;}
virtual ~Quote()=default; //动态链接析构函数
private:
string bookNo; //这本书的isbn号
protected:
double price=0.0; //不打折的价格
};
//继承,如何继承?
class Bulk_quote : public Quote
{
public:
Bulk_quote()=default;
Bulk_quote(const string & book, double p, size_t qty, double disc)
: Quote(book, p), min_qty(qty), discount(disc)
{cout<<"Bulk_quote construct function"<<endl;}
//重写虚函数
double net_price(size_t n) const override {cout<<"double net_price(size_t)"<<endl; return n*price;}
//再次说明,请声明函数后一定要记得定义它,不然我这是出了各种莫名其妙的错误!
// ~Bulk_quote2(){cout<<"~Bulk_quote2()"<<endl;}
private:
size_t min_qty=0;
double discount=0.0;
};
void fun1()
{
Quote base;
// Bulk_quote* bulkP=&base; 错误不能把基类转换成派生类
// Bulk_quote& bulkRef=base; 同上
Bulk_quote bulk;
Quote *itemP=&bulk; //派生类转换成基类
// Bulk_quote *bulkP=itemP; error:基类到派生类
}
void fun2()
{
Bulk_quote bulk; //派生类
Quote item(bulk); //调用基类Quote的赋值构造函数
item=bulk; // calls Quote::operator=(const Quote&)拷贝赋值运算符
}
double print_total(ostream &os, const Quote &item, size_t n)
{
//根据不同的对象来绑定到这个参数的类型
//这里引用Quote::net_price 或 Bulk_quote::net_price
double ret=item.net_price(n);
os<<"ISBN: "<<item.isbn() //调用 Quote::isbn
<<" # sold: "<<n<<" total due: "<<ret<<endl;
return ret; //这里上面的Quote参数是可以接受Quote或者Bulk_quote类型的
}
void fun3()
{
Quote base("0-201-82470-1", 50);
print_total(cout, base, 10); //调用Quote的net_price
Bulk_quote derived("0-201-82470-1", 50, 5, 0.19);
print_total(cout, derived, 10); //调用Bulk_quote的net_price
base=derived; //吧quote类型的部分拷贝到base
base.net_price(20);
}
struct B
{
virtual void f1(int) const;
virtual void f2();
void f3();
};
struct D1 : B //这是什么继承?
{
void f1(int) const override; //ok可以覆盖
// void f2(int) override; error没有f2(int)这个虚函数
// void f3() override; //error:f3()不是虚函数
// void f4() override; error:没有f4()这个虚函数
};
struct D2 : B
{
//从B继承f2,f3之后我们override f1
void f1(int) const final; //之后派生类无法覆盖f1
};
struct D3 : D2
{
void f2();
// void f1(int) const; //注意:这个函数是被final修饰的函数
};
void fun4()
{
cout<<"there is fun4"<<endl;
Quote *baseP;
double undiscounted = baseP->Quote::net_price(42);
}
class Disc_quote : public Quote
{
public:
Disc_quote()=default;
Disc_quote(const string & book, double price, size_t qty, double disc):
Quote(book, price), quantity(qty), discount(disc) {cout<<"Disc_quote构造函数"<<endl;}
double net_price(size_t) const = 0; //纯虚函数
protected:
size_t quantity=0;
double discount=0.0;
};
void fun5()
{
cout<<"there is fun5"<<endl;
// Disc_quote discount; //error:Disc_quote是一个抽象类,含有纯虚函数没法实例化
Bulk_quote bulk; //ok,这个里面没有纯虚函数,不是抽象类
}
class Bulk_quote2 : public Disc_quote
{
public:
Bulk_quote2()=default;
//直接初始化
Bulk_quote2(const string& book, double price, size_t qty, double disc):
Disc_quote(book, price, qty, disc) {}
double net_price(size_t) const override; //覆盖纯虚函数
};


原文地址:http://blog.csdn.net/cutter_point/article/details/38079365