您的位置:首页 > 编程语言 > C语言/C++

C++对于虚函数声明的严格要求

2010-01-24 15:05 253 查看
今天看书,书上有一句这样的话。

派生类中对于要重写基类中的虚函数的声明必须完全一直,唯一的例外是:基类中的虚函数是返回基类对象的指针或者引用,那么派生类中的那个虚函数我们不仅仅可以返回基类对象的指针或函数,而且还可以返回派生类对象的指针或引用。

为了验证C++是否对虚函数的声明是否要求严格。我特地做了如下测试

基类定一个const版的虚函数。派生类定义了一个和基类完全一样的函数,但是去除了const。

使用静态的或非静态的指向基类的指针指向这2个对象,调用成员函数;发现调用的始终是基类的版本。

得出结论:

C++对于虚函数声明的一致性要求确实严格

以下是我的测试代码

#include <iostream>
#include <string>
#include <cstddef>

class Item_base
{
public:
Item_base(const std::string &book, double d) : isbn(book), price(d) { }
std::string book() const;
virtual double net_price(std::size_t) const;
virtual ~Item_base() { }		//基类要定义虚析构函数
protected:
double price;		//单价,受保护的成员,为派生类要重写net_price中需要用到此成员
private:
std::string isbn;	//让派生类不能直接访问isbn,只能通过基类的接口获取isbn
};

std::string Item_base::book() const
{
return isbn;
}

double Item_base::net_price(std::size_t n) const
{
return price * n;
}

class Bulk_item : public Item_base
{
public:
Bulk_item(const std::string &book, double d, unsigned min, double discount): Item_base(book, d), unMin(min), dDiscount(discount) { }
virtual double net_price(std::size_t n);
private:
unsigned unMin;
double dDiscount;
};

double Bulk_item::net_price(std::size_t n)
{
if (n >= unMin)
{
return n * price * (1 - dDiscount);
}
else
return n * price;

}

int main()
{
Item_base *p;    //const Item_base *p;
Item_base item1("111", 10);
Bulk_item item2("222", 10, 10, 0.1);
p = &item1;
p->net_price(10);
p = &item2;
p->net_price(10);

return EXIT_SUCCESS;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: