C++继承语法
当继承时,我们会发现“这个新类很像原来的类”。我们规定,在代码中和原来一样给 出该类的名字,但在类的左括号的前面,加一个冒号和基类的名字(对于多重继承,要给 出多个基类名,它们之间用逗号分开)。当做完这些时,将会自动地得到基类中的所用数 据成员和成员函数。下面是一个例子:
//Useful.h
#define USEFUL_H
#include<iostream>
using namespace std;
class X {
int i;
public:
X() {i = 0;}
void set(int ii) {i = ii;cout << "X::set(): " << i << endl;}
int read() const {return i;}
int permute() {return i = i*47;}
};
//Inheritance.cpp
#include "Useful.h"
#include <iostream>
using namespace std;
class Y : public X{
int i;
public:
Y() {i = 0;};
int change(){
i = permute();
return i;
}
void set(int ii){
i = ii+1;
cout << i << endl;
}
};
int main(){
cout << "sizeof(X) = " << sizeof(X) << endl;
cout << "sizeof(Y) = " << sizeof(Y) << endl;
Y D;
D.change();
D.read();
D.permute();
D.set(12);
D.X::set(11);
}
我们可以看到Y对X进行了继承,这意味着Y将包含X中的所有数据成员和成员函数。 实际上,正如没有对X进行继承,而在Y中创建了一个X的成员对象一样,Y是包含了X的 一个子对象。无论是成员对象还是基类存储,都被认为是子对象。 所有X中的私有成员在Y中仍然是私有的,这是因为Y对X进行了继承并不意味着Y可 以不遵守保护机制。X中的私有成员仍然占有存储空间,只是不可以直接地访问它们罢 了。 在main()中,从sizeof(Y)是sizeof(X)的两倍可以看出,Y的数据成员是同X的 成员结合在一起了。 我们注意到,本例中的基类前面是public。由于在继承时,基类中所有的成员都是被 预设为私有的,所以如果基类的前面没有public,这意味着基类的所有公有成员将在派生 类中变为私有的。这显然不是所希望的 [1] ,我们希望基类中的所有公有成员在派生类中 仍是公有的。这可以在继承时通过使用关键字public来实现。 在change()中,基类的permute()函数被调用。即派生类可以直接访问所有基类 的公有函数。 派生类中的set()函数重新定义了基类中set()函数。这即是说,如果调用一个Y类 型对象的read()和permute()函数,将会使用基类中的这些函数(这可在main()中表 现出来)。但如果调用一个Y类型对象的set()函数,将会使用派生类中的重定义版本。 这意味着如果不想使用某个继承而来的函数,我们可以改变它的内容(当然我们也可以增 加全新的函数,例如change())。 然而,当我们重新定义了一个函数的后,仍可能想调用基类的函数。但如果对于 set(),只是简单地调用set()函数,将得到这个函数的本地版本—一个递归的函数调 用。为了调用基类的set()函数,必须使用作用域运算符来显式地标明基类名。