C++ primer中的这个问题自相矛盾了吗????
C++ primer 原文:
inline IntArrayRC::IntArrayRC( int sz)
: IntArray( sz ) {}
inline IntArrayRC::IntArrayRC( const int *iar, int sz )
: IntArray( iar, sz ) {}
由冒号分割出来的部分称作成员初始化列表member initialization list 它提供了一种
机制通过这种机制我们可以向IntArray 的构造函数传递参数两个IntArrayRC 构造函数
的函数体都是空的因为它们的工作就是把参数传递给相关的IntArray 构造函数我们无需
提供显式的IntArrayRC 析构函数因为派生类没有引入任何需要析构的数据成员继承过来
的需要析构的IntArray 成员都由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;
};
为什么他还要把class IntArray这个基类中的析构函数定义成虚函数那???????????????
[解决办法]
我们“无需提供显式的IntArrayRC 析构函数”因为派生类没有引入任何需要析构的数据成员继承过来的需要析构的IntArray 成员都由IntArray 的析构函数来处理。
LZ看清楚他说的是哪个类。。。
[解决办法]
说的是派生类,基类还是需要析构的
[解决办法]
现在只是有一个IntArrayRC一个子类,
它不需要自己提供析构函数,
但谁能保证,以后没有别的类继承自IntArray,而且还需要显式的提供自己的析构函数呢?
很多资料上说,
基类虚函数声明为virtual,而且有时是纯vritual,是非常常见的,
对abstract的基类来说是必须的
[解决办法]
你说的我知道啊,就是
“为什么他还要把class IntArray这个基类中的析构函数定义成虚函数那?”
声明成虚函数就说明在派生类中要重新定义这个析构函数啊。
不一定要在派生类重新定义虚函数的,不重新定义就调用基类的虚函数
[解决办法]
但是如果在基类中定义了构造函数,定义一个析构函数也是很自然的,基类的析构函数一般就要定义成vitual的,因为在以后的类扩展中你也许会在派生类中引入析构函数,毕竟vitual基类的析构函数也没什么坏处!