一、类继承
基类:定义私有、保护、公有三类的成员变量和成员函数。
class base {
private:
int a;
void test1() {}
protected:
int b;
void test2() {}
public:
int c;
void test3() {}
};
1.公有继承
除了父类的private成员不可见(不可见:继承了但是无法直接访问)外;父类的保护成员 继承为 子类的保护成员,父类的公有成员 继承为 子类的公有成员,可以直接访问。
class public_derived :public base {
void f1() {
//test1(); a = 1; 基类私有成员无法直接访问
test2(); b = 2; //成为子类的保护成员
test3(); c = 3; //成为子类的公有成员
}
};
因为基类私有成员对派生类不可见,故可在派生类重写(覆盖)它们。
class base { private: int a = 1; void test1() { cout << "base test1()" << endl; } }; class public_derived :public base { public: //重写(覆盖)父类私有成员 int a = 10; void test1() { cout << "public_derived test1()" << endl; } }; //测试 int main() { public_derived pub; cout << pub.a << endl; pub.test1(); }
运行结果:
10 public_derived test1()
强调一点,继承是继承基类的全部成员,包括私有成员。
如下可看到,继承,就是派生类继承了基类的全部成员,且可在此基础上扩充(指f1函数)。
2.保护继承
除了父类的private成员不可见,其他都继承为保护成员,对外界不可见
class protected_derived :protected base {
void f1() {
cout << "private f()" << endl;
//test1(); a = 1; 基类私有成员无法直接访问
test2(); b = 2; //成为子类的保护成员
test3(); c = 3; //成为子类的保护成员
}
};
3.私有继承
默认行为,除了父类的private成员不可见,其他都继承为私有成员
class private_derived :private base {
void f1() {
cout << "private f()" << endl;
//test1(); a = 1; 基类私有成员无法直接访问
test2(); b = 2; //成为子类的私有成员
test3(); c = 3; //成为子类的私有成员
}
};
二、using 引用基类成员
用法:using 基类名::基类成员名;
含义:将基类的某保护或公有成员声明为本派生类此part(private/protected/public)的成员,不管
什么继承方式。派生类的using不能作用于基类的私有成员,因为不可见~
当using声明所在part为private:
class derived :private或protected或public base { private: //将父类的保护和公有成员都声明为子类的私有成员,不管什么继承方式 using base::b; using base::test2; using base::c; using base::test3; };
当using声明所在part为protected:
class derived :private或protected或public base { protected: //将父类的保护和公有成员都声明为子类的保护成员,不管什么继承方式 using base::b; using base::test2; using base::c; using base::test3; };
当using声明所在part为public:
class derived :private或protected或public base { public: //将父类的保护和公有成员都声明为子类的公有成员,不管什么继承方式 using base::b; using base::test2; using base::c; using base::test3; };