C++对于虚函数声明的严格要求
2010-01-24 15:05
253 查看
今天看书,书上有一句这样的话。
派生类中对于要重写基类中的虚函数的声明必须完全一直,唯一的例外是:基类中的虚函数是返回基类对象的指针或者引用,那么派生类中的那个虚函数我们不仅仅可以返回基类对象的指针或函数,而且还可以返回派生类对象的指针或引用。
为了验证C++是否对虚函数的声明是否要求严格。我特地做了如下测试
基类定一个const版的虚函数。派生类定义了一个和基类完全一样的函数,但是去除了const。
使用静态的或非静态的指向基类的指针指向这2个对象,调用成员函数;发现调用的始终是基类的版本。
得出结论:
C++对于虚函数声明的一致性要求确实严格
以下是我的测试代码
派生类中对于要重写基类中的虚函数的声明必须完全一直,唯一的例外是:基类中的虚函数是返回基类对象的指针或者引用,那么派生类中的那个虚函数我们不仅仅可以返回基类对象的指针或函数,而且还可以返回派生类对象的指针或引用。
为了验证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; }
相关文章推荐
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- c++函数内部声明函数,在函数外面实现函数是可以的
- c++函数必须先声明在使用
- C++中的const成员函数(函数声明后加const,或称常量成员函数)用法详解
- 成员函数声明为常量的解释--C++学习笔记
- Why? 在C++中调用被C编译后的函数,要在声明的前面加extern "C"
- C++中 当函数所有参数都需要类型转换时 需要将其声明为non-member函数
- 探讨C++中不能声明为虚函数的有哪些函数
- C++ 函数匹配和作用域声明
- c++声明/定义,静态/非静态,变量/函数
- source insight3.0 c++脚本 通过函数声明 生成函数定义
- C++中,类和函数分开定义声明和实现的方法
- C++箴言:声明为非成员函数时机
- C++设计的一个小缺陷——不必强制类普通成员函数在类体中声明
- C++ 变量和函数的声明和定义
- 理解复杂的C/C++声明 const, typedef , 函数指针
- C++ 函数返回值声明为const的原因
- C++中不能声明为虚函数的有哪些函数
- [C++再学习系列] 函数声明与STL容器构造
- C/C++ 函数原型(或函数声明)的相同点与不同点