大家看看有必要吗???
C++primer 中的原文:
为使IntArray 类能够被继承我们需要在语法上做一点小小的改变必须可选择的
减少封装的层次以便允许派生类访问非公有的实现而且我们也必须显式地指明哪些函数
应该是虚拟的最重要的变化在于我们如何把一个类设计成为基类
在基于对象的程序设计中通常类的提供者只有一个但是类的用户有许多个提供者
设计并且通常也会实现类用户使用提供者提供的公有接口行为的分离可通过将类分成公
35 第二章 C++浏览
有与私有访问级别而反映出来
在继承机制下有多个类的提供者一个提供基类实现可能还有一些派生类另外一
个或多个提供者在继承层次的生命周期内提供派生类这种行为也是一种实现行为于类的
提供者经常但并不总是需要访问基类的实现为了提供这种能力同时还要防止对基类
实现的一般性访问C++提供了另外一个访问级别保护protected 级别在类的保护区
域内的数据成员和成员函数不提供给一般的程序只提供给派生类放在基类的私有区
域内的成员只能供该类自己使用派生类不能使用下面是修改过的IntArray 类
class IntArray {
public:
// 构造函数
explicit IntArray( int size = DefaultArraySize );
IntArray( int *array, int array_size );
IntArray( const IntArray &rhs );
// 虚拟析构函数
virtual ~IntArray() { delete [] ia; }
// 等于和不等于操作
bool operator==( const IntArray& ) const;
bool operator!=( const IntArray& ) const;
IntArray& operator=( const IntArray& );
int size() const { return _size; }
// 去掉了索引检查功能 . . .
virtual int& operator[](int index) { return ia[index]; }
virtual void sort();
virtual int min() const;
virtual int max() const;
virtual int find( int value ) const;
protected:
// 参见13.5 节的说明
static const int DefaultArraySize = 12;
void init( int sz, int *array );
int _size;
int *ia;
};
他这个程序中的 virtual int& operator[](int index) { return ia[index]; }
virtual void sort();
virtual int min() const;
virtual int max() const;
virtual int find( int value ) const; 有必要声明成虚函数吗??????
[解决办法]
你可以先去掉virtual,然后测试嘛。
[解决办法]
你只是试了试,而不是严格的测试,所以没试出来很正常。
建议你继续多试,直到试出问题。当然,C++ Primer的那段再反复看看。
[解决办法]
我觉得第一个是有必要的,我的理解:
作者这里的意思是,把这几个函数声明为virtual,以便在子类中提供不同的实现
比如virtual int& operator[](int index) { return ia[index]; }
在后面的一个子类IntArrayRC里,实现为带有越界检查:
virtual int& operator[](int index)
{
check_range( index );
return ia[index];
}
后面的
virtual void sort();
virtual int min() const;
virtual int max() const;
virtual int find( int value ) const;
这几个函数,作者没有详细表述其在不同子类中的实现
关于是否应该把成员函数声明为virtual,
后面好像还有一道习题