注意:不是所有的函数都能继承;构造函数、析构函数和 operator:= 不能继承
重载:同名不同参的函数名称的重载;
重写:子类对父类函数的重写;
隐藏:
覆盖:
声明 | 继承 | |
---|---|---|
private | 私有声明 | 私有继承 |
protected | 保护声明 | 保护继承 |
public | 公有声明 | 公有继承 |
声明: 是对类中属性做权限声明;
私有声明:仅基类可以访问,派生类和基类类对象不可直接访问;
保护声明:基类和派生类可以直接访问;类对象不可直接访问;
公有声明:基类,派生类,基类对象都可以直接访问;
继承 对可以继承下来的成员,私有成员继承下来是不可以访问的,保护成员和公有成员继承下来是可以访问的。继承前面加限定,限定是对可以访问的成员做权限设置;
私有继承:把可访问的成员设成私有声明;
保护继承:把可以访问的成员设成保护声明;
公有继承:不修改可以访问的成员的声明;
注意:有虚函数时,会自动继承虚指针,并映射对应的虚函数表
#include <stdio.h>
#include <iostream>
using namespace std;
class A
{
protected:
int m_data;
public:
A(int data = 0)
{
m_data = data;
}
int GetData()
{
return doGetData();
}
int doGetData()
{
return m_data;
}
};
class B: public A
{
protected : int m_data;
public:
B(int data = 1)
{
m_data = data;
}
int doGetData()
{
return m_data;
}
};
class C : public B
{
protected : int m_data;
public :
C(int data = 2)
{
m_data = data;
}
};
int main()
{
C c(10);
cout<<c.GetData() << endl;
cout<<c.A::GetData()<<endl;
cout<<c.B::GetData()<<endl;
cout<<c.C::GetData()<<endl;
cout<<c.doGetData()<<endl;
cout<<c.A::doGetData()<<endl;
cout<<c.B::doGetData()<<endl;
cout<<c.C::doGetData()<<endl;
//cout << A::doGetData()<<endl; 这种调用方式是错的
return 0;
}
/*
结果为 0 0 0 0 1 0 1 1
*/
1 #include <iostream>
2 using namespace std;
3
4 class A {
5 public:
6 static void doGetData() {
7 cout << "A" << endl;
8 }
9 };
10
11 class B: public A
12 {
13 public:
14 void doGetData() {
15 cout << "B" << endl;
16 }
17 };
18
19 class C : public A {
20 public:
21 static void doGetData() {
22 cout << "C" << endl;
23 }
24 };
25
26
27 int main()
28 {
29 B b ;
30 b.doGetData();
31 b.A::doGetData();
32
33 // B::doGetData(); // 错误
34
35 C::doGetData();
36
37 return 0;
38 }
/*
结果为
B
A
C
*/
网友评论